gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:30:31 24 4
gpt4 key购买 nike

在下面的例子中,为什么 A 不等于 B ?问题与 Date 列有关,因为 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 与空白而不是字符“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

关于r - 当数据框包含日期格式时,为什么按列应用求和并且 colSums 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64445773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com