r-当数据帧包含日期格式时,为什么应用按列求和和和colSums不同



在下面的例子中,为什么A不等于B?这个问题与日期列有关,因为AA=BB,但我不明白为什么。。。

library(lubridate)
MM=data.frame(ID=1:3,Date=ymd(c("2019-11-07","2019-11-07","2019-11-13")),X=c(-1,1,1),Y=c(1,-1,-1))
A=apply(MM,2,function(x) sum(x>0))
B=colSums(MM>0)
A
# ID Date    X    Y
# 3    3    0    0 
B
# ID Date    X    Y 
# 3    3    2    1
AA=apply(MM[,-2],2,function(x) sum(x>0))
BB=colSums(MM[,-2]>0)
AA
# ID  X  Y 
# 3  2  1 
BB
# ID  X  Y 
# 3  2  1 

R版本4.0.3(2020-10-10(

这是因为apply在将函数应用于每列之前,首先将data.frame转换为矩阵。

因此:

> as.matrix(MM)
ID  Date         X    Y   
[1,] "1" "2019-11-07" "-1" " 1"
[2,] "2" "2019-11-07" " 1" "-1"
[3,] "3" "2019-11-13" " 1" "-1"

所有内容都转换为字符。

具体来说,您可以看到:

> " 1" > 0
[1] FALSE
> "1" > 0
[1] TRUE

这是因为0已转换为char。

"0";在";1〃;按字母顺序,因为将字符0与空白而不是字符"0"进行比较;1〃;。

字符串的顺序是通过逐字符1乘以1来决定的。(这与"10" > "9"FALSE的原因相同,因为1按字母顺序在9之前(。

> sort(c("0", " 1"))
[1] " 1" "0" 
> sort(c("0", "1"))
[1] "0" "1"

因此:

> as.matrix(MM)>0
ID Date     X     Y
[1,] TRUE TRUE FALSE FALSE
[2,] TRUE TRUE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE

colSums不能做到这一点。


如果你这样做,你可以得到与colSums相同的结果:

> apply(MM>0, 2, sum)
ID Date    X    Y 
3    3    2    1 

最新更新