将部分列名称传递给函数

时间:2012-04-16 13:34:41

标签: r dataframe

我希望使用一个功能来加速数据清理过程。在显示的示例中,如果当天的“.no”列的值为1,我希望删除am和pm列中报告的值。

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我认为以更整洁的格式提供数据更好的做法,并正在制定一个涉及重新组织数据的解决方案。但是,当数据采用原始格式时,能够做到这一点也很方便。

感谢。

1 个答案:

答案 0 :(得分: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){...