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.call
和lapply
的区别:
do.call:
do.call
的第二个参数与第一个参数(函数)的正式命名参数相匹配。因此 'event.5' 项目被提供给 as.factor
并且解释器无法在 as.factor
的形式参数中找到任何匹配的项目,从而产生错误。 `do.call 在其正式列表中没有省略号。
lapply:
第一个参数的元素逐个(未命名)传递给函数。有一个可选的省略号机制允许提供进一步的参数,但它们是作为一个整体而不是一个接一个地提供的。这些参数必须命名,并且不会出现部分名称匹配。命名参数甚至可能包含形式函数的第一个,因此它是形式中的第一个参数,与从 X 参数到 lapply
的值相匹配。如果你想以一个一个的方式传递多个列表,那么看看 mapply
.
@nicola 的解决方案还将 "[]"
放在 LHS 上,以便使用 []<-
而不仅仅是 <-
。这具有保留 data.frame 结构的效果。
由于重新开始投票,我只是添加另一种解释 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
的长度相同,并将结果存储在列表中。
希望这能澄清一点。
我有以下 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.call
和lapply
的区别:
do.call:
do.call
的第二个参数与第一个参数(函数)的正式命名参数相匹配。因此 'event.5' 项目被提供给 as.factor
并且解释器无法在 as.factor
的形式参数中找到任何匹配的项目,从而产生错误。 `do.call 在其正式列表中没有省略号。
lapply:
第一个参数的元素逐个(未命名)传递给函数。有一个可选的省略号机制允许提供进一步的参数,但它们是作为一个整体而不是一个接一个地提供的。这些参数必须命名,并且不会出现部分名称匹配。命名参数甚至可能包含形式函数的第一个,因此它是形式中的第一个参数,与从 X 参数到 lapply
的值相匹配。如果你想以一个一个的方式传递多个列表,那么看看 mapply
.
@nicola 的解决方案还将 "[]"
放在 LHS 上,以便使用 []<-
而不仅仅是 <-
。这具有保留 data.frame 结构的效果。
由于重新开始投票,我只是添加另一种解释 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
的长度相同,并将结果存储在列表中。
希望这能澄清一点。