2012-04-16 129 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