我遇到了一些在R中必须非常容易的事情;我想用相应的值填充(data.frame)列中的缺失值。像这样:
V1 V2
cat tree
cat NA
NA tree
dog house
NA house
dog NA
horse NA
NA car
horse car
所以对应的cat字符串是tree,所以" tree"必须在" cat组"中存在NA时填写。 "房子"必须填写"狗组中的NA" (所以我必须选择将列表中的第一个单词作为"前导"单词填写每个数字 - 编辑 - >当第一个单词没有引导时,它会更好NA的情况是第一个)。
V1
中有很多NA,V2
中有一些NA,我想只填写V2
的NA。< / p>
在SPSS中,它完成了聚合函数,但我不认为R中的聚合函数在这种情况下具有可比性,或者是它?谁知道怎么做?
谢谢!
答案 0 :(得分:4)
OP要求缺少值需要按按组填写。因此,zoo::na.locf()
方法可能会失败。
有一种名为 update join 的方法,可用于填写每组的缺失值:
library(data.table) # version 1.10.4 used
setDT(DT)
DT[DT[!is.na(V1)][order(V2), .(fillin = first(V2)), by = V1], on = "V1", V2 := fillin][]
# V1 V2
# 1: 1 tree
# 2: 1 tree
# 3: 1 tree
# 4: 2 house
# 5: 2 house
# 6: 2 house
# 7: 3 lawn
# 8: 3 lawn
# 9: 4 NA
#10: 4 NA
#11: NA NA
#12: NA tree
请注意,输入数据已经过补充,以涵盖一些极端情况。
该方法包括两个步骤。首先,确定要按组填写的值,然后确定更新加入,它会修改DT
到位。
fill_by_group <- DT[!is.na(V1)][order(V2), .(fillin = first(V2)), by = V1]
fill_by_group
# V1 fillin
#1: 2 house
#2: 3 lawn
#3: 1 tree
#4: 4 NA
DT[fill_by_group, on = "V1", V2 := fillin][]
order(V2)
可确保最后对所有NA
值进行排序,以便first(V2)
选择要填写的正确值。
更新加入方法已被评估为最快的方法in another case。
na.omit()
docendo discimus 已在his comment中建议使用na.omit()
。这可以用于更新加入以及替换order()
/ first()
:
DT[DT[!is.na(V1), .(fillin = na.omit(V2)), by = V1], on = "V1", V2 := fillin][]
请注意,na.omit(V2)
与此处的na.omit(V2)[1]
或first(na.omit(V2))
一样有用。
编辑:OP已经大幅更改了原来发布的数据集。作为快速解决方案,我已更新下面的示例数据,以包含V1
为NA
的案例。
library(data.table)
DT <- fread(
"1 tree
1 NA
1 tree
2 house
2 house
2 NA
3 NA
3 lawn
4 NA
4 NA
NA NA
NA tree")
请注意,OP提供的数据已经补充,以涵盖另外三种情况:
V2
值为NA
。V2
值均为NA
。V1
是“NA。答案 1 :(得分:1)
您可以使用dplyr
并尝试:
mydata %>%
group_by(V1) %>%
mutate(V2 = unique(V2[!is.na(V2)]))
答案 2 :(得分:-1)
您可以在下面使用:
mydata<-read.table(text="1 tree
1 NA
1 tree
2 house
2 house
2 NA")
mydata[is.na(mydata$V2),]$V2<-mydata[which(is.na(mydata$V2))-1,]$V2