更好的方法是将这个函数应用到数据帧的每一行?

Adr*_*ian 1 r

我想将一个函数应用于数据帧的每一行,如下所示.我知道如何在数据框只包含数字的情况下使用apply,但是如果行包含booleans/logicals,字符串和整数呢?例:

df <- data.frame(x=1:10,
                 y=c(TRUE, FALSE),
                 z=letters[1:10],
                 stringsAsFactors=FALSE)

RowFunction <- function(row) {
  if (row$y) return(row$x)
  return (row$z)
}

sapply(1:dim(df)[1], function(i) { RowFunction(df[i, ]) })
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?我的第一个想法是apply(df, 1, RowFunction)在添加row <- as.list(row)到RowFunction的开头之后使用,但这不起作用,因为应用将df强制转换为数组,该数组无法处理包含不同数据类型的行.

仅仅为了我的R知识,我想知道是否有更清洁的方法来做到这一点sapply(1:dim(df)[1], ... ).有任何想法吗?

提前致谢!

And*_*rie 6

在这种情况下,您可以简单地使用ifelse:

sapply(1:dim(df)[1], function(i) { RowFunction(df[i, ]) })
 [1] "1" "b" "3" "d" "5" "f" "7" "h" "9" "j"

with(df, ifelse(y, x, z))
 [1] "1" "b" "3" "d" "5" "f" "7" "h" "9" "j"
Run Code Online (Sandbox Code Playgroud)

为了方便和可读性,我也使用了with- 这允许您仅通过名称引用列,而无需使用$运算符.