首页 > 解决方案 > 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 中使用)更改为过characterx$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] 中的错误:二元运算符的非数字参数

我错过了什么?

谢谢

标签: rapply

解决方案


该函数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

推荐阅读