我想将一个函数应用于数据帧的每一行,如下所示.我知道如何在数据框只包含数字的情况下使用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], ... ).有任何想法吗?
提前致谢!
在这种情况下,您可以简单地使用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- 这允许您仅通过名称引用列,而无需使用$运算符.