我有一个类似于下面例子的数据集。我希望能够做的是根据非缺失值及其相关的“名称”为所有缺失值分配正确的“标题”值。因此,名称为“A”的所有条目都将具有标题“X”,并且类似于“B”和“Y”。
Name | Title
-------------
A | X
A | NA
A | NA
B | NA
B | Y
B | Y
每个“名称”应该只有一个“标题”值,尽管这一个值可能会出现多次。
我想有几个曲折的条件循环可以实现这一点,但我很好奇是否有更整洁/更有效的方法来解决这个问题?
答案 0 :(得分:5)
可能有更优雅的解决方案,但这非常简单,应该相当强大:
lu <- unique(df[complete.cases(df),]) ## Make a look-up table
df$Title <- lu$Title[match(df$Name, lu$Name)] ## Use it to find Name-->Title mappings
## Check that it worked
df
# Name Title
# 1 A X
# 2 A X
# 3 A X
# 4 B Y
# 5 B Y
# 6 B Y
答案 1 :(得分:3)
您可以按名称和标题排序,然后使用动物园包中的na.locf
:
library(zoo)
na.locf(mydf[order(mydf$Name, mydf$Title),])
Name Title
1 A X
2 A X
3 A X
5 B Y
6 B Y
4 B Y
答案 2 :(得分:2)
您还可以根据每个组的唯一Title
值(也是非NA)重新创建该列。
这是dplyr
版本:
dt = data.frame(Name = c("A","A","A","B","B","B"),
Title = c("X",NA,NA,NA,"Y","Y"),
stringsAsFactors = F)
library(dplyr)
dt %>% group_by(Name) %>%
do(data.frame(Name = .$Name,
Title2 = unique(.$Title[!is.na(.$Title)]),
stringsAsFactors=F)) %>%
ungroup
# Name Title2
# (chr) (chr)
# 1 A X
# 2 A X
# 3 A X
# 4 B Y
# 5 B Y
# 6 B Y
这是一个data.table
版本:
dt = data.frame(Name = c("A","A","A","B","B","B"),
Title = c("X",NA,NA,NA,"Y","Y"),
stringsAsFactors = F)
library(data.table)
dt = setDT(dt)
dt[, Title2 := unique(Title[!is.na(Title)]), by="Name"][,Title:=NULL]
dt
# Name Title2
# 1: A X
# 2: A X
# 3: A X
# 4: B Y
# 5: B Y
# 6: B Y
不确定是否要为此任务使用其他软件包,但请记住这一点,以防您需要创建一个非常大的查找表,并且您更喜欢使用这样的过程。