【问题标题】:dplyr summarize by preferred string valuedplyr 按首选字符串值汇总
【发布时间】:2021-07-14 18:19:33
【问题描述】:

我有一个包含 ID 和字符串值的数据框,其中一些我比其他人更喜欢:

library(dplyr)

d1<-data.frame(id=c("a", "a", "b", "b"), 
           value=c("good", "better", "good", "good"))

我想用数字处理与以下示例等效的内容:

d2<-data.frame(id=c("a", "a", "b", "b"), 
           value=c(1, 2, 1, 1))

d2 %>% group_by(id) %>%
       summarize(max(value))

所以如果一个 ID 有多个值,我总是会得到每个 ID 的最大数字:

# A tibble: 2 x 2
  id    `max(value)`
  <fct>        <dbl>
1 a                2
2 b                1

等效,如果一个 ID 有多个字符串,我总是想为 d1 数据帧提取首选字符串:如果我们有“好”,则使用该行,如果另一行有“更好”,则使用该行,从而消除重复的 ID。

例子是任意的,也可以是>>如果我们有“yes”和“unknown”那么取“yes”,否则取“unknown”

那么dplyr::summarize() 函数是否有“提取最佳字符串”函数?

结果应该是这样的:

id | value
----------
"a"| "better"
"b"| "good"

【问题讨论】:

标签: r string dplyr summarize


【解决方案1】:

您可以尝试因子方法。 首先,您需要一个有序的字符串向量,例如:

my_levels <- c("better", "good")

然后您相应地更改级别,转换为数字,汇总并转换回来。

d1 %>% 
  mutate(value_num = factor(value, levels = my_levels) %>% as.numeric) %>% 
  group_by(id) %>%
  summarize(res = min(value_num)) %>% 
  mutate(res_fac = factor(res, labels = my_levels))
# A tibble: 2 x 3
id      res res_fac
<chr> <dbl> <fct>  
1 a         1 better 
2 b         2 good

【讨论】:

    【解决方案2】:

    类似于@roman 的回答,但使用data.table 包,您可以执行以下操作来过滤“更好”的行:

    require(data.table)
    setDT(d1)
    
    # convert value to factor
    d1[ , value := factor(value, levels = c('better', 'good'))]
    # return first ordered value by each id group
    d1[ , .SD[order(value)][1], id]
    

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2018-07-31
      • 2015-02-02
      • 2015-05-05
      • 2017-03-22
      相关资源
      最近更新 更多