Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当dataframe包含日期格式时,为什么按列应用sum和colSums不同?_R_Date_Sum_Apply_Lubridate - Fatal编程技术网

当dataframe包含日期格式时,为什么按列应用sum和colSums不同?

当dataframe包含日期格式时,为什么按列应用sum和colSums不同?,r,date,sum,apply,lubridate,R,Date,Sum,Apply,Lubridate,在下面的例子中,为什么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

在下面的例子中,为什么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已转换为字符

“0”按字母顺序出现在“1”之前,因为字符0与空白字符比较,而不是字符“1”。

字符串的顺序由一个字符一个字符的比较决定。 (这与
“10”>“9”
FALSE
的原因相同,因为
1
按字母顺序在
9
之前)

因此:

> 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 

相比之下,
MM>0
处理
Date
对象下面的整数值。
sapply
也不这样做,因此
sapply(MM,函数(x)和(x>0))
按预期工作。并且所有内容都强制到字符矩阵(而不是“日期-时间”)。@Roland,感谢您的有用评论(向上投票!)Ok!谢谢但是,
as.matrix(MM)[1]>0中测试的是什么?为什么
“1”>0
返回TRUE而
“1”>0
不返回TRUE?
> apply(MM>0, 2, sum)
  ID Date    X    Y 
   3    3    2    1