【问题标题】:Dplyr : how to find the first-non missing string by groups?Dplyr:如何按组查找第一个非缺失字符串?
【发布时间】:2017-03-23 17:57:06
【问题描述】:

考虑以下简单示例

group <-c('A','A','A','B','B','B','B')
names<- c(NA,'fred',NA,'josh','josh',NA,NA)
data=data_frame(group,names)

> data
# A tibble: 7 × 2
  group names
  <chr> <chr>
1     A  <NA>
2     A  fred
3     A  <NA>
4     B  josh
5     B  josh
6     B  <NA>
7     B  <NA>

在这里,我想为每个group 获取names 中的第一个非缺失名称。我怎样才能做到这一点?以下使用coalescefirst 的解决方案失败。

data %>% group_by(group) %>% mutate(first_non_missing = first(names),
                                    first_non_missing_alt = coalesce(names)) %>% ungroup()

# A tibble: 7 × 4
  group names first_non_missing first_non_missing_alt
  <chr> <chr>             <chr>                 <chr>
1     A  <NA>              <NA>                  <NA>
2     A  fred              <NA>                  fred
3     A  <NA>              <NA>                  <NA>
4     B  josh              josh                  josh
5     B  josh              josh                  josh
6     B  <NA>              josh                  <NA>
7     B  <NA>              josh                  <NA>

确实,对于A 组,first_non_missing 对于所有三个观察值都应该是 fred..

非常感谢!

【问题讨论】:

  • 预期的结果是什么?找到的名称是否应该填充给定组中新变量中的所有值?
  • 是的,它只是一个普通的变异。相同大小的原始数据框,以及一个新列,该列只为每个组重复 names 中的第一个非缺失字符串
  • 谢谢哥们,但有人比你快 :D
  • 也许使用na.omitdata %&gt;% group_by(group) %&gt;% summarise(first_non_missing = na.omit(names)[1])

标签: r dplyr


【解决方案1】:

Summarise 将为每个组提供一个条目,在这里,使用 which 查找第一个非缺失项

data %>%
  group_by(group) %>%
  summarise(first_non_missing = names[which(!is.na(names))[1]])

给予

  group first_non_missing
  <chr>             <chr>
1     A              fred
2     B              josh

如果您仍需要所有行,请将summarise 替换为mutate

【讨论】:

  • 是的,这是有道理的。谢谢!此外,我不知道coalesce 应该做什么,因为它在这里不起作用......
  • 很高兴它有效。我相信coalesce 旨在用于 列,而不是在其中。也就是说,如果您有三个 name 列,它将返回第一列,并且每一行都有一个非缺失值。
  • 它的实用性实际上比你想象的要大。想象一个案例,您有一个表格,允许受访者在他们的名字之外包括他们的“首选”名字。如果您正在处理他们,您希望使用首选名称,但前提是它包含在内。因此,您可以创建一个列 data %&gt;% mutate(toAddress = coalesce(preferred, first) )
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 2021-09-03
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多