Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.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
由于长度检查不正确,R tapply()在data.frame上不起作用_R_Dataframe_Tapply - Fatal编程技术网

由于长度检查不正确,R tapply()在data.frame上不起作用

由于长度检查不正确,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

这是错误报告,不是问题。报告R core中的bug的过程看起来很复杂,我不想成为邮件列表的一部分。所以我在这里发布这个(根据推荐)

这是:

R4.0.3的
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.frame
tapply
并不期望
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)