对于r中的每个组,用同一列的另一行中的值替换NA

对于r中的每个组,用同一列的另一行中的值替换NA,r,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中执行此操作?我们可以使用data.table来执行此操作。将“data.frame”转换为“data.table”(set

对于每个组的给定列,我需要将每行的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中执行此操作?

我们可以使用
data.table
来执行此操作。将“data.frame”转换为“data.table”(
setDT(df1)
)。按“id”分组,我们将“name”替换为“name”中的非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
注意:这里我假设每个“id”组中只有一个唯一的非NA值

或者,另一种选择是在我们通过“id”和“name”对数据进行排序之后,将数据集与数据的
unique
行连接起来

 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
注意:上的
仅适用于
data.table的devel版本。安装devel版本的说明如下

数据
df1这里是一种使用
dplyr
的方法。从数据框
x
中,我们按
id
分组,并用相关值替换
NA
。我假设每个
id
都有一个唯一的
name

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
x%
分组依据(id)%>%
变异(名称=唯一(名称[!is.na(名称)])
来源:本地数据帧[6 x 2]
组:id
#身份证名称
#11A
#21 a
#3.2 b
#4.3 c
#5.3 c
#6.3 c
Base R

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

dif每个
id
始终至少有一个非
NA
,您可以使用任何上一个观察结转函数,比如来自
zoo
zoo::NA.locf(df1[带有(df1,顺序(id,名称)),])
使用@akruns数据
d<-na.omit(df)
transform(df,name=d$name[match(id,d$id)])