假设我的数据集看起来像
ID Name
1 JAY
1
1 JAY
2 LAY
2 LAY
2
3 NA
3 KAY
3
我想根据组中已有的观察结果用缺失值(空或 NA)填充行。所以结果数据框看起来像
ID Name
1 JAY
1 JAY
1 JAY
2 LAY
2 LAY
2 LAY
3 KAY
3 KAY
3 KAY
我尝试使用na.locf
但它不适用于非数值。
DF1 = setDT(DF)[, N := na.locf(na.locf(Name(NA_real_^!Name),na.rm=FALSE), fromLast=TRUE, na.rm=FALSE), ID][is.na(N), N := 0]
一种选择是按“ID”分组后,对不存在的“名称”进行子集化NA
并且不是空白(nzchar(Name)
),得到最后的观察结果(tail(...)
) 并赋值 (:=
) 将其改为“名称”。
setDT(DF)[, Name := tail(Name[!is.na(Name) & nzchar(Name)], 1), by = ID]
DF
# ID Name
#1: 1 JAY
#2: 1 JAY
#3: 1 JAY
#4: 2 LAY
#5: 2 LAY
#6: 2 LAY
#7: 3 KAY
#8: 3 KAY
#9: 3 KAY
如果“名称”列是factor
改变nzchar(Name)
to nzchar(as.character(Name))
或者在“i”中指定逻辑向量并分配(:=
)最后一次观察(Name[.N]
) 按“ID”分组后改为“名称”
setDT(DF)[!is.na(Name) & nzchar(Name), Name := Name[.N], ID]
注意:要使第二个解决方案起作用,“名称”应该是character
class.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)