首页 > 解决方案 > 按名称分组并将 r 中的列数相加

问题描述

我有一个包含 405 个观察值和 39 个变量的数据集。但是只有两列对于进一步分析很重要。

我想将具有相似名称的第一行组合在一起,并从第二列中将它们的编号相加。

可重现的数据集如下所示:

df1 <- data.frame(name=c("Google Ads", "Google Doubleclick","Facebook Login",
"Facebook Ads","Twitter MoPub","Flurry","Amazon advertisment","Microsoft ","Ad4screen","imobi"),
value=c(10,20,30,40,50,60,70,80,90,100),unimportant=c(1,2,3,4,5,6,7,8,9,10))

结果应该在一个新的 data.frame 中,如下所示:

 df2 <- data.frame (name=c("Google","Facebook","Twitter","Flurry","Amazon","Microsoft","Others"),
value=c(30,70,50,60,70,80,190))

标签: rstring

解决方案


一种tidyverse方法。

  • 首先将所有有效名称存储在一个向量中说valid_names
  • 此后创建一个新列all_names,例如df1-
    • 首先' '使用分割空间中的所有字符串str_split
    • 此后用于purrr::map_chr()检查是否有任何拆分字符串与您的匹配,valid_names如果是,则仅检索该字符串,否则获取others
  • 此后group_by在这个领域。(我先省略了一步mutate,然后group_by直接在group_by语句中创建了新字段,有效)
  • 现在根据需要总结您的important价值观。
valid_names =c("Google","Facebook","Twitter","Flurry","Amazon","Microsoft")

valid_names
#> [1] "Google"    "Facebook"  "Twitter"   "Flurry"    "Amazon"    "Microsoft"

df1 <- data.frame(name=c("Google Ads", "Google Doubleclick","Facebook Login",
                         "Facebook Ads","Twitter MoPub","Flurry","Amazon advertisment","Microsoft ","Ad4screen","imobi"),
                  value=c(10,20,30,40,50,60,70,80,90,100),unimportant=c(1,2,3,4,5,6,7,8,9,10))
df1
#>                   name value unimportant
#> 1           Google Ads    10           1
#> 2   Google Doubleclick    20           2
#> 3       Facebook Login    30           3
#> 4         Facebook Ads    40           4
#> 5        Twitter MoPub    50           5
#> 6               Flurry    60           6
#> 7  Amazon advertisment    70           7
#> 8           Microsoft     80           8
#> 9            Ad4screen    90           9
#> 10               imobi   100          10
library(tidyverse)

df1 %>% group_by(all_names = str_split(name, ' '),
               all_names = map_chr(all_names, ~ ifelse(any(.x %in% valid_names),.x[.x %in% valid_names], 'others'))) %>%
  summarise(value = sum(value), .groups = 'drop')
#> # A tibble: 7 x 2
#>   all_names value
#>   <chr>     <dbl>
#> 1 Amazon       70
#> 2 Facebook     70
#> 3 Flurry       60
#> 4 Google       30
#> 5 Microsoft    80
#> 6 others      190
#> 7 Twitter      50

reprex 包(v2.0.0)于 2021-06-22 创建


推荐阅读