2012-04-16 94 views
1

我正在寻找使用函数来加速数据清理过程。在所示的例子,我希望消除在上午和下午的列报值,如果这一天的“没有”一栏有1将部分列名传递给函数

df1 = data.frame (identifier = c(1:4), mon.no = c(1,NA,NA,NA),mon.am = c(2,1,NA,3),mon.pm = c(3,4,NA,5), tues.no = c(NA,NA,1,NA),tues.am = c(2,3,1,4),tues.pm = c(3,3,2,3))

我设想使用函数值使用天清理数据:

clean1 = function (day) { 
df1$day.am[df1$day.no==1] = NA 
df1$day.pm[df1$day.no==1] = NA 
return (df1)} 
df2 = clean1(mon) 

但是,这会返回以下错误。

Error in `$<-.data.frame`(`*tmp*`, "day.am", value = logical(0)) : 
replacement has 0 rows, data has 4 

我认为这是因为该函数需要一个完整的列名称,并且无法填充文本输入周围的间隙?是否有可能以这种方式使用功能?

阅读these notes我认为最好让我的数据保持整洁,并且正在处理涉及重新组织数据的解决方案。但是,当数据处于原始格式时,能够做到这一点也很方便。

谢谢。

+0

不,这是因为你将星星传递给它,它不知道星期一是什么。你必须传递一个对象或字符串到一个函数。 mon既不是。所以你有一天的参数,但实际上并没有在函数中使用day参数。 – 2012-04-16 13:39:16

+0

我认为'grep'系列中的东西就是你所追求的。 – 2012-04-16 13:41:36

回答

1

你真的很接近。 @Tyler Rinker在评论中解释了为什么它不起作用。这里有一个修复:

clean1 = function (day) { 
    day.am = paste(day, "am", sep=".") # make a string from the variable day and the suffixes 
    day.pm = paste(day, "pm", sep=".") 
    day.no = paste(day, "no", sep=".") 
    df1[day.am][df1[day.no]==1] = NA 
    df1[day.pm][df1[day.no]==1] = NA 
    return (df1)} 

df2 = clean1("mon") # "mon" should be a string 

别人可能会提供更有效的方式来做到这一点。请注意,您只能在这里使用原来的df1。如果你现在运行

df3 = clean1("tues") 

你将不会得到一个两天清理的数据帧。你可以通过提供数据帧来解决这个问题:

clean2 = function(df, day){... 
+0

你好,感谢你的回答,它似乎正是我想要的。我将根据实际数据对其进行测试(除非建议更有效的解决方案),然后我会接受它。 – BuckyOH 2012-04-16 14:49:25

+0

另外,感谢编辑。在实践中,我计划每次重写df1以保持整洁。但是,在处理子集时,以这种方式指定data.frame和column会很有用。 – BuckyOH 2012-04-16 14:52:21