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

why sapply() and tapply() have the same result, but not identical?

这是我的代码

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"。

为什么 identical(tapply(pulse, group, length),sapply(list,length)) 是假的?如何调整我的代码使它们完全相同?

谢谢。

如果我们检查每个输出的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)