0

我有以下称为培训的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,...)

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

4

3 回答 3

2

我认为解释错误消息最有用,因为@nicola 已经提出了“正确答案”。do.call和的区别lapply

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

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

@nicola 的解决方案"[]"[]<-<-. 这具有保留 data.frame 结构的效果。

于 2015-03-30T22:02:24.563 回答
2

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

两者都do.calllapply函数和列表作为参数(即使顺序不同)。但差异是巨大的。

写作

do.call(fun,list)

基本上是一样的:

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

您只调用fun一次,并且list是 的参数fun

对于lapply

lapply(list,fun)

大致相当于:

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

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

希望这能澄清一点。

于 2015-03-30T22:17:56.497 回答
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
于 2015-03-30T21:48:22.547 回答