我需要为每个组的给定列替换不同行的非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?
中执行此操作答案 0 :(得分:5)
以下是使用dplyr
的方法。在数据框x
中,我们按id
进行分组,并将NA
替换为相关值。我假设name
每id
有一个唯一值。
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的名称有一个唯一值(强制它)