在数据框R

时间:2017-04-20 13:37:10

标签: r string dataframe aggregate

我遇到了一些在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中的聚合函数在这种情况下具有可比性,或者是它?谁知道怎么做?

谢谢!

3 个答案:

答案 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已经大幅更改了原来发布的数据集。作为快速解决方案,我已更新下面的示例数据,以包含V1NA的案例。

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