我有以下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,...)
我可以手动将每列转换为因子,但我想要更优雅的东西。我非常感谢任何建议。谢谢!
答案 0 :(得分:2)
我认为解释错误信息是最有用的,因为@nicola已经提出了#34;正确答案&#34;。 do.call
和lapply
之间的差异:
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.call
和lapply
之间的区别,以补充@BondedDust所写的内容。
do.call
和lapply
都将函数和列表作为参数(即使顺序不同)。但差别很大。
写作
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
的长度相同,并将结果存储在列表中。
希望这有点澄清。
答案 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