如果我有这样的数据框:
df <- cbind.data.frame(c("a", "b", "a", "b", "b"), c(1,0,0,1,0), c(0, NA, 0, 0, 1))
无论我是否包含字符列,我应该怎么做才能为第 3 列返回 1?
apply(df, 2, FUN = function(x){sum(x == 1 & !is.na(x))})
第 3 列返回 0
apply(df[,2:3], 2, FUN = function(x){sum(x == 1 & !is.na(x))})
第 3 列返回 1
解释为什么整个数据集上的
apply
与子集相比会给出不同的结果 (df
<> df[,2:3]
)。
查看
apply
如何处理异构数据(character
和 numeric
)
apply(df, 2, FUN = function(x) x)
c("a", "b", "a", "b", "b") c(1, 0, 0, 1, 0) c(0, NA, 0, 0, 1)
[1,] "a" "1" " 0"
[2,] "b" "0" NA
[3,] "a" "0" " 0"
[4,] "b" "1" " 0"
[5,] "b" "0" " 1"
自从
应用(X,保证金,... 期望 -> X:一个数组,包括一个矩阵
并且它包括结果转换为字符的第一个字符列(只有
data.frame
和list
可以保存不同的数据类型),并且由于NA
,第三列最大单元格长度为2,因此所有元素都得到扩展通过填充空格将长度调整为 2 (" 1"
,即 != 1
)。
在子集上使用
apply
会保留 numeric
apply(df[,2:3], 2, function(x) x)
c(1, 0, 0, 1, 0) c(0, NA, 0, 0, 1)
[1,] 1 0
[2,] 0 NA
[3,] 0 0
[4,] 1 0
[5,] 0 1
或使用
sapply
,因为我们无论如何都在列上操作