首页 文章

dplyr function group_by error

提问于
浏览
2

我有库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是数据帧,它包含很多值,包括上面函数中提到的值:“vel”和“longPk” .

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

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函数有效,但它适用于没有group的数据帧 .

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

2 回答

  • 0

    我能够重现错误 . 我们发现,零碎地测试代码

    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 [,(names(dadesCom1)== i)]不能用作分组变量,因为它是tbl_df / tbl / data.frame

    只需添加

    dadesCom1 <- as.data.frame(dadesCom1)
    

    到你的第一个声明的最后 .

    我还建议使用 library(dplyr) 并删除你的内联电话

  • 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
    

相关问题