Как сгруппировать и выбрать элементы данных, используя tidyr / dplyr - PullRequest
1 голос
/ 05 апреля 2019

У меня есть таблица в формате tibble, которую мне нужно переставить:

AUS   CAN   DEN   original_period

NA    NA    4.3    1955-02
3.2   NA    NA     1955-02
NA    1.1   NA     1955-02
3.1   NA    NA     1955-03
NA    NA    9.7    1955-03
NA    1.2   NA     1955-03

Так что на данный момент у меня есть одно действительное значение на элемент в строке.Моя цель - устранить все NA и все дубликаты original_period, чтобы моя таблица выглядела следующим образом:

AUS   CAN   DEN   original_period

3.2   1.1   4.3    1955-02
3.1   1.2   9.7    1955-03

Кто-нибудь знает, как сделать это эффективно, используя tidyr или dplyr?

данные

df1 <- read.table(h=T,strin=F,text="
AUS   CAN   DEN   original_period
NA    NA    4.3    1955-02
3.2   NA    NA     1955-02
NA    1.1   NA     1955-02
3.1   NA    NA     1955-03
NA    NA    9.7    1955-03
NA    1.2   NA     1955-03")

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

Мы можем сгруппировать по 'original_period' и с помощью summarise_all либо удалить все элементы NA в строке с помощью na.omit (при условии, что элементы NA распределены поровну по группам во всех столбцах), либо использовать mean/max/min и т. Д. если есть только одно наблюдение без NA на группу

library(dplyr)
df1 %>%
    group_by(original_period) %>%
    summarise_all(mean, na.rm = TRUE) %>%
    # or remove the NAs with na.omit
    #summarise_all(na.omit) %>%       
    select(names(df1))
# A tibble: 2 x 4
#     AUS   CAN   DEN original_period    
#   <dbl> <dbl> <dbl> <chr>          
#1   3.2   1.1   4.3 1955-02        
#2   3.1   1.2   9.7 1955-03        
1 голос
/ 05 апреля 2019

Мы также можем использовать coalesce:

library(dplyr)
df1 %>%
  group_by(original_period) %>%
  summarise_all(~coalesce(!!!.))

# # A tibble: 2 x 4
#   original_period   AUS   CAN   DEN
#   <chr>           <dbl> <dbl> <dbl>
# 1 1955-02           3.2   1.1   4.3
# 2 1955-03           3.1   1.2   9.7
...