R - 如何基于单个当前值有条件地在矢量中设置多个值

时间:2015-10-03 15:32:39

标签: r

我有一个类似于下面例子的数据集。我希望能够做的是根据非缺失值及其相关的“名称”为所有缺失值分配正确的“标题”值。因此,名称为“A”的所有条目都将具有标题“X”,并且类似于“B”和“Y”。

Name | Title
-------------
A    |  X
A    |  NA
A    |  NA
B    |  NA
B    |  Y
B    |  Y

每个“名称”应该只有一个“标题”值,尽管这一个值可能会出现多次。

我想有几个曲折的条件循环可以实现这一点,但我很好奇是否有更整洁/更有效的方法来解决这个问题?

3 个答案:

答案 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

不确定是否要为此任务使用其他软件包,但请记住这一点,以防您需要创建一个非常大的查找表,并且您更喜欢使用这样的过程。