dplyr函数group_by出现错误

4
我有一个关于dplyr库函数的问题。我想按照不同的值(“group_by”)对数据框进行分组。其中一些值是固定的(始终相同),而另一些是通过矢量引入的。这个矢量可能具有可变的维度。将数据框分组后,我想应用“mutate”函数。
我已经尝试了不同的方法。第一个方法如下所示,并包括一个循环,遍历“campToAgregate”向量(其中包含需要对数据框进行分组的值)。
campToAgregate = c("via","nomDem")

dadesCom <- dades 

for(i in 1:length(campToAgregate)){
  if(i==1){
  dadesCom1 <- dadesCom %>% dplyr::group_by(dadesCom[,which(names(dadesCom) == campToAgregate[i])], dat, add=TRUE) %>%
               dplyr::mutate(vel1 = round(weighted.mean(vel, longPk, na.rm = TRUE), 0))
  dadesCom1 <- dadesCom1[,-(ncol(dadesCom1)-1)]
  }else{
  dadesCom2 <- dadesCom1 %>% dplyr::group_by(dadesCom1[,which(names(dadesCom1) == campToAgregate[i])], add=TRUE) %>%
               dplyr::mutate(vel1 = round(weighted.mean(vel, longPk, na.rm = TRUE), 0))
  }
  }

当我运行这段代码时,控制台会出现以下错误:

Error in mutate_impl(.data, dots) : not compatible with STRSXP

我不知道怎么解决它...

我还尝试了另一种方法:

for(i in 1:length(campToAgregate)){
  if(i==1){
    dadesCom <- dadesCom %>% dplyr::group_by(dadesCom[,which(names(dadesCom) == campToAgregate[i])], dat, add=TRUE)
  }else{
    dadesCom <- dadesCom %>% dplyr::group_by(dadesCom1[,which(names(dadesCom1) == campToAgregate[i])], add=TRUE)
  }
}

dadesCom <- dadesCom %>% dplyr::mutate(vel = round(weighted.mean(vel, longPk, na.rm = TRUE), 0))

但是在这种情况下,group_by函数不起作用。mutate函数能够工作,但它被应用于没有分组的数据框。

有人知道我在代码中犯了哪些错误吗?谢谢。


我无法重现你的示例,所以我猜测这个建议。我没有看到 dat 在任何地方被定义,而你似乎正在尝试按数据框进行分组。group_by 期望未引用的变量名。在你的情况下,你并不总是知道变量名,因此取消引用它们可能是一个挑战。这是一个使用 group_by_at 很有用的情况,因为你可以将变量名的字符向量传递给 .vars 参数,并获得相同的效果。 - Benjamin
2个回答

1
我能够重现这个错误。逐步测试代码后,我们发现
dadesCom2 <- dadesCom1 %>%
               dplyr::group_by(dadesCom1[,which(names(dadesCom1) == campToAgregate[i])], add=TRUE) %>%
               dplyr::mutate(vel1 = round(weighted.mean(vel, longPk, na.rm = TRUE), 0))

产生了这个错误

在grouped_df_impl(data, unname(vars), drop)中出现错误: 列dadesCom1[, which(names(dadesCom1) == i)]不能作为分组变量,因为它是一个tbl_df/tbl/data.frame

只需添加

dadesCom1 <- as.data.frame(dadesCom1)

到你的第一个语句的结尾。

我建议使用 library(dplyr) 并删除内联调用。


1
这可以通过使用整洁的评估语义来实现。以下是一个示例,使用 mtcars 作为未提供样本数据的示例:
library(dplyr)

ag <- c(quo(cyl), quo(gear))

lapply(ag, function(x) mtcars %>%
         group_by(!!x) %>%
         mutate(vel1 = round(weighted.mean(hp, wt, na.rm = TRUE), 0)))

根据所需的输出,summarise 可能是更适合的函数,因为它只会为每个组显示一行。
lapply(ag, function(x) mtcars %>%
         group_by(!!x) %>%
         summarise(vel1 = round(weighted.mean(hp, wt, na.rm = TRUE), 0)))

[[1]]
# A tibble: 3 x 2
    cyl  vel1
  <dbl> <dbl>
1     4    83
2     6   122
3     8   209

[[2]]
# A tibble: 3 x 2
   gear  vel1
  <dbl> <dbl>
1     3   182
2     4    94
3     5   219

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接