由于长度检查不正确,R tapply()在data.frame上不起作用
这是错误报告,不是问题。报告R core中的bug的过程看起来很复杂,我不想成为邮件列表的一部分。所以我在这里发布这个(根据推荐) 这是: R4.0.3的由于长度检查不正确,R tapply()在data.frame上不起作用,r,dataframe,tapply,R,Dataframe,Tapply,这是错误报告,不是问题。报告R core中的bug的过程看起来很复杂,我不想成为邮件列表的一部分。所以我在这里发布这个(根据推荐) 这是: R4.0.3的tapply()帮助在参数X上说明了以下内容: 存在拆分方法的R对象。通常类似向量,允许使用[]进行子集划分 问题:此R对象不能是data.frame,但可以拆分和子集data.frame 要复制,请运行以下命令: func <- function(dt) { sum(dt[,1] * dt[,2]) } tab <- d
tapply()
帮助在参数X
上说明了以下内容:
存在拆分方法的R对象。通常类似向量,允许使用[]进行子集划分
问题:此R对象不能是data.frame,但可以拆分和子集data.frame
要复制,请运行以下命令:
func <- function(dt) {
sum(dt[,1] * dt[,2])
}
tab <- data.frame(x = sample(100), y = sample(100), z = sample(letters[1:10], 100, T))
tapply(tab[,1:2], INDEX = tab$z, FUN = func)
但是length()
不是调用data.frame以确定其是否具有正确的拆分维度的相关函数。应改用nrow()
将上述代码替换为
if(is.data.frame(X)) {
len <- nrow(X)
} else {
len <- length(X)
}
if (!all(lengths(INDEX) == len))
stop("arguments must have same length")
if(is.data.frame(X)){
len根据功能,我们可以使用
library(dplyr)
tab %>%
group_by(z) %>%
summarise(new = func(cur_data()), .groups = 'drop')
-输出
# A tibble: 10 x 2
# z new
# <chr> <int>
# 1 a 26647
# 2 b 28010
# 3 c 31340
# 4 d 20780
# 5 e 33311
# 6 f 31880
# 7 g 37527
# 8 h 8752
# 9 i 15490
根据?t按
X-存在拆分方法的R对象。通常类似向量,允许使用[]进行子集剖分
这里,选项卡[,1:2]
是一个data.frame,而不是一个向量
。如果它是一个矩阵
,它将是一个向量
,具有dim
属性Ok,因此似乎by()
是tapply()
与data.frame等效。但是为什么不让tapply
在data.frame上工作呢?@jeanlain约束是您创建函数的方式,而不是tapply
expects@jeanlain这不是您提到的错误。如果您检查?taply
,它期望X
作为向量,函数expects作为data.frametapply
并不期望X
是data.frame,这与我正在应用的函数无关。我想知道这个限制的意义。@jeanlain这里,X是选项卡[1:2]
这是一个data.frame,您的函数将参数作为data.frame。不清楚您对data.frame上下文的注释length
是ncol
。上面显示的函数更适合by
而不是tapply
。
# A tibble: 10 x 2
# z new
# <chr> <int>
# 1 a 26647
# 2 b 28010
# 3 c 31340
# 4 d 20780
# 5 e 33311
# 6 f 31880
# 7 g 37527
# 8 h 8752
# 9 i 15490
by(tab[, 1:2], tab$z, FUN = func)