如何解决当数据框包含日期格式时,为什么按列应用总和,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],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与空白而不是字符“ 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。