我的数据按地理位置和年份有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并整理比例的新数据框。 如果有人可以指出我正在尝试的错误或提供其他解决方案,将不胜感激!
答案 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
注意-如果数据集很大,这将非常有效