Apply 根据包含的列返回不同的值

问题描述 投票:0回答:1

如果我有这样的数据框:

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

r apply
1个回答
0
投票

解释为什么整个数据集上的

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
,因为我们无论如何都在列上操作

© www.soinside.com 2019 - 2024. All rights reserved.