我有以下类型的数据框:
Country <- rep(c("USA", "AUS", "GRC"),2)
Year <- 2001:2006
Level <- c("rich","middle","poor",rep(NA,3))
df <- data.frame(Country, Year,Level)
df
Country Year Level
1 USA 2001 rich
2 AUS 2002 middle
3 GRC 2003 poor
4 USA 2004 <NA>
5 AUS 2005 <NA>
6 GRC 2006 <NA>
我想在右栏的最后一行用正确的级别标签填充缺失的值。
所以预期的结果应该是这样的:
Country Year Level
1 USA 2001 rich
2 AUS 2002 middle
3 GRC 2003 poor
4 USA 2004 rich
5 AUS 2005 middle
6 GRC 2006 poor
答案 0 :(得分:12)
在基地R中,您可以使用ave()
:
transform(df, Level = ave(Level, Country, FUN = na.omit))
# Country Year Level
# 1 USA 2001 rich
# 2 AUS 2002 middle
# 3 GRC 2003 poor
# 4 USA 2004 rich
# 5 AUS 2005 middle
# 6 GRC 2006 poor
另一种更准确的可能性是使用连接。在这里,我们将Country
列与NA省略的数据合并。结果是相同的,只是以不同的行顺序。
merge(df["Country"], na.omit(df))
# Country Year Level
# 1 AUS 2002 middle
# 2 AUS 2002 middle
# 3 GRC 2003 poor
# 4 GRC 2003 poor
# 5 USA 2001 rich
# 6 USA 2001 rich
答案 1 :(得分:10)
我们可以按“国家/地区”分组并获取非NA唯一值
library(dplyr)
df %>%
group_by(Country) %>%
dplyr::mutate(Level = Level[!is.na(Level)][1])
# A tibble: 6 x 3
# Groups: Country [3]
# Country Year Level
# <fctr> <int> <fctr>
#1 USA 2001 rich
#2 AUS 2002 middle
#3 GRC 2003 poor
#4 USA 2004 rich
#5 AUS 2005 middle
#6 GRC 2006 poor
如果我们已将dplyr
与plyr
一起加载,则最好明确指定dplyr::mutate
或dplyr::summarise
,以便它使用dplyr
中的函数。 plyr
中有相同的功能,当加载两个函数创建不同的行为时,它可能会掩盖dplyr
中的函数。
答案 2 :(得分:8)
您可以使用data.table
和zoo
执行此操作: -
library(data.table)
library(zoo)
setDT(df)
df[, Level := na.locf(Level), by = Country]
这会给你: -
Country Year Level
1: USA 2001 rich
2: AUS 2002 middle
3: GRC 2003 poor
4: USA 2004 rich
5: AUS 2005 middle
6: GRC 2006 poor
答案 3 :(得分:5)
library(dplyr)
df %>%
group_by(Country) %>%
mutate(Level = replace(Level, is.na(Level), unique(na.omit(Level))))
Country Year Level <fctr> <int> <fctr> 1 USA 2001 rich 2 AUS 2002 middle 3 GRC 2003 poor 4 USA 2004 rich 5 AUS 2005 middle 6 GRC 2006 poor
或者,更简洁地说,应用@ suchait的想法来使用na.locf
:
df %>%
group_by(Country) %>%
mutate(Level = zoo::na.locf(Level))
答案 4 :(得分:1)
library(dplyr)
library(tidyr)
df %>%
arrange(Country) %>%
fill(Level) %>%
arrange(Year)
# Country Year Level
# 1 USA 2001 rich
# 2 AUS 2002 middle
# 3 GRC 2003 poor
# 4 USA 2004 rich
# 5 AUS 2005 middle
# 6 GRC 2006 poor
答案 5 :(得分:1)
以下是另一个data.table
解决方案使用从给定数据集本身创建的查找表更新连接:
library(data.table)
setDT(df)[df[!is.na(Level)], on = .(Country), Level := Level][]
Country Year Level 1: USA 2001 rich 2: AUS 2002 middle 3: GRC 2003 poor 4: USA 2004 rich 5: AUS 2005 middle 6: GRC 2006 poor