如何按组保留值(删除NA)?

时间:2019-04-10 12:52:44

标签: r

我的数据按地理位置和年份有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))

因此,基本上,我希望代码按Year和FIPS在'prop'变量中搜索现有比例(如果缺少,则为NA),并创建具有唯一FIPS和Year并整理比例的新数据框。 如果有人可以指出我正在尝试的错误或提供其他解决方案,将不胜感激!

3 个答案:

答案 0 :(得分:2)

您可以为此使用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 :(得分:1)

您可以尝试在基本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

答案 2 :(得分:1)

您可以使用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

注意-如果数据集很大,这将非常有效