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

R: I can't convert all my data.frame columns in factors using 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,...)

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

你可以这样做:

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

我认为解释错误消息是最有用的,因为@nicola 已经提供了 "correct answer"。 do.calllapply的区别:

do.call: do.call 的第二个参数与第一个参数(函数)的正式命名参数相匹配。因此 'event.5' 项目被提供给 as.factor 并且解释器无法在 as.factor 的形式参数中找到任何匹配的项目,从而产生错误。 `do.call 在其正式列表中没有省略号。

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

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

由于重新开始投票,我只是添加另一种解释 do.calllapply 之间区别的方式来补充@BondedDust 所写的内容。

do.calllapply 都将一个函数和一个列表作为参数(即使顺序不同)。但是差别很大。

写作

do.call(fun,list)

基本上是相同的:

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

您只调用了一次 funlistfun 的参数。

对于lapply

lapply(list,fun)

大致相当于:

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

您调用 fun 的次数与 list 的长度相同,并将结果存储在列表中。

希望这能澄清一点。