对于r中的每个组,用同一列的另一行中的值替换NA
对于每个组的给定列,我需要将每行的NA值替换为不同行的非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
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)])