r - R为非数字参数应用中断
问题描述
我对函数缺乏很好的理解,apply
这可能会导致在循环遍历其中一列是字符的数据帧时出现错误消息。
我apply
通过将数据帧的行传递给我的用户定义函数(UDF)来使用。
当数据框的列全部为numeric
.
当我将其中一列更改为字符时,如果我一一传递数据帧的行,我的 UDF 仍然有效。
但是,一旦我使用apply
,我就会收到此错误:
二元运算符的非数字参数
这是说明问题的代码示例:
定义一个 UDF:
UDF <- function(x){return(x[1] + x[2])}
定义一个数据框:
x <- data.frame(col1 = c(1,2), col2 = c(3,4), col3 = c(5,6))
x
col1 col2 col3
1 3 5
2 4 6
现在,如果我使用 apply,它可以工作:
apply(x,1,FUN = UDF)
[1] 4 6
如果我将 col3(注意 col3 未在 UDF 中使用)更改为过character
孔x$col3 <- as.character(x$col3)
,并且我将一行传递给 UDF,它仍然可以工作:
UDF(x[1,])
col1
1 4
但是如果我apply
在这个数据框上使用,那么它会中断并给出一个错误,说它不能加x[1]
和x[2]
:
apply(x,1,FUN = UDF)
x[1] + x[2] 中的错误:二元运算符的非数字参数
我错过了什么?
谢谢
解决方案
该函数apply
适用于矩阵(和数组)。如果apply
与 dara 框架一起使用,它会转换为最通用类型的矩阵。字符类型比数字类型更通用。因此,如果数据框中至少存在一个字符列,则所有值都将变为字符串(函数对其不起作用)。UDF
为了避免这种行为,您可以by
改用:
by(x, seq(nrow(x)), UDF)
# [1] 4
# ---------------------------------------------------------------------------------
# [1] 6
另一种选择是rowwise
在包装中dplyr
:
library(dplyr)
x %>% rowwise %>% UDF
# col1
# 1 4
# 2 6