R сворачивать строки по группе с не пропущенными значениями, когда значения являются символьными - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь свернуть / агрегировать / суммировать строки по группам, сохраняя только не пропущенные значения, где значения являются символами. Вот воспроизводимый пример.

df = data.frame(store = c("A","A", "B","B"),
                item1=c("apple","","milk",""),
                item2=c("","pear","","bread"))

df
  store item1 item2
1     A apple      
2     A        pear
3     B  milk      
4     B       bread

Я надеюсь изменить df следующим образом

df2
  store item1 item2
1     A apple  pear
2     B  milk bread

Я пытался использовать summarise_all с nchar(.) > 0 в качестве следующего, но это не не похоже на работу.

df %>%
  group_by(store) %>%
  summarise_all( ~ + any(nchar(.) > 0))

Любые комментарии приветствуются!

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Вы можете сделать:

df %>%
 group_by(store) %>%
 summarise_all(~ .[nchar(.) > 1])

  store item1 item2
  <chr> <chr> <chr>
1 A     apple pear 
2 B     milk  bread
1 голос
/ 18 марта 2020

1) pivot Измените в длинную форму, удалите элементы "" и измените форму обратно.

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(-1) %>%
  filter(value != "") %>%
  pivot_wider

давая:

# A tibble: 2 x 3
  store item1 item2
  <fct> <fct> <fct>
1 A     apple pear 
2 B     milk  bread

2) max Другой подход состоит в том, чтобы взять максимальное значение в группе, исключая NA. Это преобразует столбцы элемента в символ, тогда как выходные данные (1) являются столбцами фактора.

library(dplyr)

df %>%
  group_by(store) %>%
  summarize_all(~ max(as.character(.), na.rm = TRUE)) %>%
  ungroup

, что дает:

# A tibble: 2 x 3
  store item1 item2
  <fct> <chr> <chr>
1 A     apple pear 
2 B     milk  bread
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...