Как сохранить значения (отбрасывая НС) по группам? - PullRequest
1 голос
/ 10 апреля 2019

Мои данные имеют 3 пропорции по географии и годам. Я пытаюсь агрегировать эти данные, отбрасывая NA и сопоставляя значения по 3 различным переменным по годам и географии.

Пример кадра данных выглядит следующим образом:

df <- data.frame(FIPS = c("01001", "01001", "01001","01001", "01001", "01001", "01003", "01003", "01003", "01003", "01003", "01003"),
                 Year = c(2000, 2000, 2000, 2001, 2001, 2001, 2000, 2000, 2000, 2001, 2001, 2001),
                 prop1 = c(0.7, NA, NA, 0.5, NA, NA, 0.3, NA, NA, 0.5, NA, NA),
                 prop2 = c(NA, 0.3, NA, NA, 0.5, NA, NA, 0.3, NA, NA, 0.1, NA),
                 prop3 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.4, NA, NA, 0.4))

Я предполагаю, что это можно сделать с помощью агрегатной или отдельной команды в R, но не знаю точно, как действовать, поскольку ни один из способов, приведенных ниже, не дает мне нужный кадр данных.

df2 = aggregate(df,by = list(df$FIPS, df$Year), FUN = ???)

df2 <- df %>% distinct(FIPS, Year, .keep_all = TRUE)

Ожидаемый кадр данных выглядит следующим образом:

df2 <- data.frame(FIPS = c("01001", "01001",  "01003", "01003" ),
                  Year = c(2000,  2001,  2000,  2001),
                  prop1 = c(0.7,  0.5, 0.3, 0.5 ),
                  prop2 = c(0.3, 0.5,  0.3, 0.1),
                  prop3 = c(NA,  NA, 0.4, 0.4))

Таким образом, в основном, я хочу, чтобы код выполнял поиск существующих пропорций (или NA, если они отсутствуют) в переменных «prop» по годам и FIPS и создавал новый фрейм данных с уникальным FIPS и годом с сопоставленными пропорциями. Если кто-то может указать на ошибки в том, что я пытаюсь или дать мне другое решение, это будет очень цениться!

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

Вы можете использовать dplyr для этого:

library(dplyr)
df %>%
  group_by(FIPS, Year) %>%
  summarise_at(vars(prop1:prop3), mean, na.rm = T) %>%
  replace(is.na(.), NA)
# A tibble: 4 x 5
# Groups:   FIPS [?]
  FIPS   Year prop1 prop2 prop3
  <fct> <dbl> <dbl> <dbl> <dbl>
1 01001  2000   0.7   0.3  NA  
2 01001  2001   0.5   0.5  NA  
3 01003  2000   0.3   0.3   0.4
4 01003  2001   0.5   0.1   0.4
1 голос
/ 10 апреля 2019

Вы можете использовать data.table для достижения этого -

library(data.table)
setDT(df)[, lapply(.SD, function(x) x[!is.na(x)][1L]), by =.(FIPS,Year)]

Выход -

FIPS Year prop1 prop2 prop3
1: 01001 2000   0.7   0.3    NA
2: 01001 2001   0.5   0.5    NA
3: 01003 2000   0.3   0.3   0.4
4: 01003 2001   0.5   0.1   0.4

Примечание - Это будетэффективно, если у вас большой набор данных

1 голос
/ 10 апреля 2019

В базе R вы можете попробовать,

do.call(rbind, lapply(split(df, list(df$FIPS, df$Year)), function(i) 
                                                     sapply(i, function(j) j[!is.na(j)][1])))

#           FIPS Year prop1 prop2 prop3
#01001.2000    1 2000   0.7   0.3    NA
#01003.2000    2 2000   0.3   0.3   0.4
#01001.2001    1 2001   0.5   0.5    NA
#01003.2001    2 2001   0.5   0.1   0.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...