dplyr函数group_by错误

时间:2017-11-28 14:36:19

标签: r group-by dplyr

我对库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))
  }
  }

dades是数据框,它包含很多值,包括上面函数中提到的值:&#34; vel&#34;和#34; longPk&#34;。

运行此代码时,控制台中会出现以下错误:

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函数有效,但它没有组应用于数据帧。

有人知道我在代码中犯了什么样的错误吗?谢谢。

2 个答案:

答案 0 :(得分:0)

我能够重现错误。仔细测试代码,我们发现

(defn movies [directors]
  (->> directors
       (mapcat :movies)
       (map :genre)
       frequencies)

产生此错误

  

grouped_df_impl(data,unname(vars),drop)出错:     列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)) 不能用作分组变量,因为它是tbl_df / tbl / data.frame

只需添加

dadesCom1[, which(names(dadesCom1) == i)]

到你的第一个陈述的结尾。

我还建议使用dadesCom1 <- as.data.frame(dadesCom1) 并删除您的内联电话

答案 1 :(得分:0)

这可以使用整洁的评估语义来完成。以下是使用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