将r替换为r中每个组的相同列的另一行中的值

时间:2015-08-07 13:50:38

标签: r

我需要为每个组的给定列替换不同行的非NA值的每行的NA

让我们说样本数据如:

id   name
 1     a
 1     NA
 2     b
 3     NA
 3     c
 3     NA

期望的输出:

id   name
 1     a
 1     a
 2     b
 3     c
 3     c
 3     c

有没有办法在r?

中执行此操作

3 个答案:

答案 0 :(得分:5)

以下是使用dplyr的方法。在数据框x中,我们按id进行分组,并将NA替换为相关值。我假设nameid有一个唯一值。

x <- data.frame(id = c(1, 1, 2, rep(3,3)), 
 name = c("a", NA, "b", NA, "c", NA), stringsAsFactors=F)

require(dplyr)
x %>%
  group_by(id) %>%
  mutate(name = unique(name[!is.na(name)]))

Source: local data frame [6 x 2]
Groups: id

#  id name
#1  1    a
#2  1    a
#3  2    b
#4  3    c
#5  3    c
#6  3    c

答案 1 :(得分:4)

我们可以使用data.table来执行此操作。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1))。由“ID&ID”组合,我们更换了“&#39; name&#39;使用名称&#39;中的非NA值。

library(data.table)#v1.9.5+
setDT(df1)[, name:= name[!is.na(name)][1L] , by = id]
df1
#   id name
#1:  1    a
#2:  1    a
#3:  2    b
#4:  3    c
#5:  3    c
#6:  3    c

注意:这里我假设每个&#39; id&#39;中只有一个唯一的非NA值。基。

或者另一种选择是在我们unique之后通过&#39; id&#39;将数据集与order行数据相结合。和&#39; name&#39;。

 setDT(df1)
 df1[unique(df1[order(id, name)], by='id'), on='id', name:= i.name][]
 #   id name
 #1:  1    a
 #2:  1    a
 #3:  2    b
 #4:  3    c
 #5:  3    c
 #6:  3    c

注意:on仅适用于data.table的开发版本。安装devel版本的说明是here

数据

df1 <- structure(list(id = c(1L, 1L, 2L, 3L, 3L, 3L), name = c("a", 
NA, "b", NA, "c", NA)), .Names = c("id", "name"),
class = "data.frame",    row.names = c(NA, -6L))

答案 2 :(得分:3)

基础R

d<-na.omit(df)
transform(df,name=d$name[match(id,d$id)])

再次假设每个id的名称有一个唯一值(强制它)