R:我无法使用do.call将所有data.frame列转换为因子

时间:2015-03-30 21:43:34

标签: r do.call

我有以下data.frame称为培训:

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,...)

我可以手动将每列转换为因子,但我想要更优雅的东西。我非常感谢任何建议。谢谢!

3 个答案:

答案 0 :(得分:2)

我认为解释错误信息是最有用的,因为@nicola已经提出了#34;正确答案&#34;。 do.calllapply之间的差异:

do.call: do.call的第二个参数与第一个参数(函数)的正式命名参数匹配。所以&#39;事件5&#39; item被提供给as.factor,并且解释器找不到匹配的as.factor形式参数中的任何项,因此会生成错误。 `do.call在其正式列表中没有省略号。

lapply: 第一个参数的元素一个接一个地(和未命名)传递给函数。有一个可选的省略号机制,允许提供更多的参数,但它们是作为一个整体而不是逐个提供的。必须对这些参数进行命名,而不是对名称进行部分匹配。命名参数甚至可能包含第一个函数形式,因此它是形式中的第一个参数,它与从X参数传入lapply的值相匹配。如果您想以逐个方式传递多个列表,请查看mapply

@ nicola的解决方案还将"[]"放在LHS上,以便[]<-使用<-而不仅仅{{1}}。这具有保留data.frame结构的效果。

答案 1 :(得分: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的长度相同,并将结果存储在列表中。

希望这有点澄清。

答案 2 :(得分: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