Dplyr:如何按群组找到第一个没有丢失的字符串?

ℕʘʘ*_*ḆḽḘ 7 r dplyr

请考虑以下简单示例

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>
Run Code Online (Sandbox Code Playgroud)

在这里,我想获得,每个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>
Run Code Online (Sandbox Code Playgroud)

的确,对于小组来说A,first_non_missing应该是fred对所有三个观察......

非常感谢!

Mar*_*son 13

总结将为每个组提供一个条目,在这里,找到第一个非缺失使用 which

data %>%
  group_by(group) %>%
  summarise(first_non_missing = names[which(!is.na(names))[1]])
Run Code Online (Sandbox Code Playgroud)

  group first_non_missing
  <chr>             <chr>
1     A              fred
2     B              josh
Run Code Online (Sandbox Code Playgroud)

如果您仍想要所有行,请替换summarisemutate.

  • 它的实用性实际上比您想象的要大。想象一下这样一种情况,您有一个表单,允许受访者除了名字之外还包含他们的“首选”名字。如果您要称呼他们,则需要使用首选名称,但前提是包含该名称。因此,您可以创建一个列 `data %&gt;% mutate(toAddress = coalesce(preferred, first) )` (2认同)