为什么sapply()和tapply()具有相同的结果,但不完全相同?

时间:2015-04-11 01:07:17

标签: r sapply tapply

这是我的代码

pulse <- round(rnorm(22, 70, 10 / 3)) + rep(c(0, 5), c(10, 12))
group <- rep(c("A", "B"), c(10, 12))

tapply(pulse, group, length)

A  B 
10 12

list<-split(pulse,group)
sapply(list,length)

A  B 
10 12
identical(tapply(pulse, group, length),sapply(list,length))#FALSE
identical(tapply(pulse, group, length),as.table(sapply(list,length)))#FALSE
identical(tapply(pulse, group, length),as.vector(sapply(list,length)))#FALSE
identical(as.table(tapply(pulse, group, length)),as.table(sapply(list,length)))#TRUE

这两个函数会产生相同的结果,但为什么它们不相同?我在R中使用了typeof(),似乎两个结果都是“double”类型。

为什么相同(tapply(脉冲,组,长度),sapply(列表,长度))是否为假?如何调整我的代码以使它们相同?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果我们检查每个输出的str

str(r1)
# int [1:2(1d)] 10 12
#- attr(*, "dimnames")=List of 1
# ..$ : chr [1:2] "A" "B"
str(r2)
# Named int [1:2] 10 12
# - attr(*, "names")= chr [1:2] "A" "B"

attributes之间有所不同。一种方法是删除每个输出的attributes,它们将是相同的

 identical(as.vector(r1), as.vector(r2))
 #[1] TRUE

但是,as.vector也会移除names。如果我们需要保留names部分,请使输出attributes相同

 attributes(r1) <- attributes(r2)
 identical(r1, r2)
 #[1] TRUE

,其中

r1 <- tapply(pulse, group, length)
r2 <- sapply(list,length)