2015-03-30 49 views
0

將我所有data.frame列因素,我有以下data.frame稱爲訓練:R:我不能用do.call

event.5 er  her2 lymph grade 
TRUE  TRUE FALSE FALSE 3 
FALSE  FALSE TRUE FALSE 3 
... 

我想所有列轉換使用的因素:

training <- do.call(as.factor, training) 

,但我得到了以下錯誤:

Error in (function (x): 
unused arguments (event.5 = c (TRUE, FALSE,...) 

我可以每列手動轉換爲因素,但我想somethi更優雅。我會非常感謝任何建議。謝謝!

+3

嘗試'培訓[] < - lapply(培訓,as.factor)'。 – nicola 2015-03-30 21:47:21

+0

@nicola非常感謝! – Johnathan 2015-03-30 21:56:41

+0

重新投票:我認爲一個正確的答案將涉及澄清爲什麼'do.call'會失敗。 – 2015-03-30 22:01:09

回答

2

我認爲這將是最有用的解釋錯誤消息,因爲@nicola已經頒發的「正確答案」。 do.calllapply之間的差:

do.call: 到do.call的第二個參數相匹配的第一個參數(函數)的正式命名的參數。因此,'event.5'項目被提供給as.factor,並且解釋器在匹配的as.factor的形式參數中找不到任何項目,從而產生錯誤。 `do.call在其形式列表中沒有省略號。

lapply: 將第一個參數的元素逐個(並且未命名)傳遞給該函數。有一個可選的省略號機制,允許提供更多的參數,但它們是作爲一個整體而不是一個一個提供的。這些參數必須命名,而不是名稱的部分匹配。命名的參數甚至可能包含第一個函數形式,所以它是形式中的第一個參數,與來自參數lapply的值相匹配。如果您想逐個傳遞多個列表,請查看mapply

@ nicola的解決方案還將"[]"放在LHS上,以便使用[]<-而不僅僅是<-。這具有保留data.frame結構的作用。

0

你可以這樣做:

df <- data.frame(event.5=c(T,F), er=c(T,F), her2=c(F,T), lymph=c(F,F), grade=c(3,3)) 
df <- as.data.frame(lapply(df, as.factor)) 
df 
## event.5 er her2 lymph grade 
## 1 TRUE TRUE FALSE FALSE  3 
## 2 FALSE FALSE TRUE FALSE  3 
2

由於投票正在重新打開,我只是補充說明do.calllapply之間區別的另一種方式,以補充@BondedDust編寫的內容。

do.calllapply都以函數和列表作爲參數(即使順序不同)。但差別很大。

寫作

do.call(fun,list) 

基本上是一樣的:

fun(list[[1]],list[[2]], ... , list[[length(list)]]) 

要調用fun只是一次,listfun的論點。

lapply

lapply(list,fun) 

大致等同於:

list(fun(list[[1]]),fun(list[[2]]), ... , fun(list[[length(list)]])) 

你叫fun多次的list長度,並將結果保存在列表中。

希望澄清一下。