带空格列名的R DataFrame按列分组求和的实现问题
解决R中带空格列名的DataFrame分组求和问题
嘿,我明白你遇到的问题了——当列名包含空格时,直接用双引号引用会让dplyr误解你的意图,导致分组求和没得到预期结果。咱们一步步来解决它:
问题根源
你原来的代码里用group_by("a 1")和sum("t t"),这里的双引号会让dplyr把这些当成字符串字面量,而不是DataFrame里实际的列名。相当于你在创建一个新的字符串列来分组,而不是用已有的a 1列,自然得不到正确的求和结果。
正确的解决方法
下面是几种可行的方案,你可以选最顺手的用:
方法1:用反引号包裹带空格的列名(最直接)
这是处理带特殊字符列名最常用的方式,用反引号``把列名包起来,告诉dplyr这是一个列名:
library(dplyr) # 你的原始数据框(其实后面的colnames赋值可以省略,因为创建时已经指定了列名) df <- data.frame("a 1"=c("jan","jan" , "feb"),"t t" =c(10,10,1)) # 正确的分组求和代码 result <- df %>% group_by(`a 1`) %>% summarise(`t t` = sum(`t t`)) print(result)
运行后会得到你想要的结果:
# A tibble: 2 × 2 `a 1` `t t` <chr> <dbl> 1 jan 20 2 feb 1
方法2:使用.data代词(适合用字符串引用列名的场景)
如果你习惯用字符串来指定列名,可以用.data代词来引用DataFrame中的列:
df %>% group_by(.data[["a 1"]]) %>% summarise(`t t` = sum(.data[["t t"]]))
方法3:用符号转换(适合列名存放在变量中的场景)
如果你的列名是保存在变量里的,可以用sym()把字符串转成符号,再用!!(bang-bang)来求值:
group_col <- "a 1" sum_col <- "t t" df %>% group_by(!!sym(group_col)) %>% summarise(!!sum_col := sum(!!sym(sum_col)))
这样就能完美解决带空格列名的分组求和问题啦!
内容的提问来源于stack exchange,提问作者vishal
相关产品推荐
相关产品推荐

