1

我正在寻找使用功能来加快数据清理过程。在显示的示例中,如果当天的“.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

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

阅读了这些笔记后,我认为将我的数据整理成一个整洁的格式会是更好的做法,并且正在研究一种涉及重新组织我的数据的解决方案。但是,在数据处于原始格式时能够执行此操作也很方便。

谢谢。

4

1 回答 1

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){...
于 2012-04-16T13:51:29.573 回答