R 如何用另一个数据帧中的值替换变量的NAs
我希望这个不是愚蠢的 我有两个带有变量ID和gender/sex的数据帧。在df1中,有NAs。在df2中,变量是完整的。我想用df2中的值来完成df1中的列。 在df1中,该变量称为性别。在df2中,它被称为性 以下是我迄今为止所做的尝试:R 如何用另一个数据帧中的值替换变量的NAs,r,match,dplyr,na,R,Match,Dplyr,Na,我希望这个不是愚蠢的 我有两个带有变量ID和gender/sex的数据帧。在df1中,有NAs。在df2中,变量是完整的。我想用df2中的值来完成df1中的列。 在df1中,该变量称为性别。在df2中,它被称为性 以下是我迄今为止所做的尝试: #example-data ID<-seq(1,30,by=1) df1<-as.data.frame(ID) df2<-df1 df1$gender<-c(NA,"2","1",NA,"2","2","2","2","2","2"
#example-data
ID<-seq(1,30,by=1)
df1<-as.data.frame(ID)
df2<-df1
df1$gender<-c(NA,"2","1",NA,"2","2","2","2","2","2",NA,"2","1","1",NA,"2","2","2","2","2","1","2","2",NA,"2","2","2","2","2",NA)
df2$sex<-c("2","2","1","2","2","2","2","2","2","2","2","2","1","1","2","2","2","2","2","2","1","2","2","2","2","2","2","2","2","2")
#Approach 1:
NAs.a <- is.na(df1$gender)
df1$gender[NAs.a] <- df2[match(df1$ID[NAs.a], df2$ID),]$sex
#Approach 2 (i like dplyr a lot, perhaps there´s a way to use it):
library("dplyr")
temp<-df2 %>% select(ID,gender)
#EDIT:
#df<-left_join(df1$gender,df2$gender, by="ID")
df<-left_join(df1,df2, by="ID")
非常感谢。这可能是base R最简单的方法
idx <- is.na(df1$gender)
df1$gender[idx] = df2$sex[idx]
你可以
df1 %>% select(ID) %>% left_join(df2, by = "ID")
# ID sex
#1 1 2
#2 2 2
#3 3 1
#4 4 2
#5 5 2
#6 6 2
#.. ..
这假设——如示例中所示——来自df1的所有ID也存在于df2中,并且在那里有性别信息
如果数据中有其他列,也可以尝试以下方法:
df1 %>% select(-gender) %>% left_join(df2[c("ID", "sex")], by = "ID")
这里有一个使用data.tables二进制连接的快速解决方案。这将只连接性别和性别,并保留所有其他列不变
library(data.table)
setkey(setDT(df1), ID)
df1[df2, gender := i.sex][]
# ID gender
# 1: 1 2
# 2: 2 2
# 3: 3 1
# 4: 4 2
# 5: 5 2
# 6: 6 2
# 7: 7 2
# 8: 8 2
# 9: 9 2
# 10: 10 2
# 11: 11 2
# 12: 12 2
# 13: 13 1
# 14: 14 1
# 15: 15 2
# 16: 16 2
# 17: 17 2
# 18: 18 2
# 19: 19 2
# 20: 20 2
# 21: 21 1
# 22: 22 2
# 23: 23 2
# 24: 24 2
# 25: 25 2
# 26: 26 2
# 27: 27 2
# 28: 28 2
# 29: 29 2
# 30: 30 2
@用户2982730,您是否使用了示例中的数据?dplyr 0.4.1Ok没有任何错误,我遇到了这个问题:tableDatensatz$SEXT,useNA=总是带来0/1/NA,那么tablesampleframe$SEXT有0/1。那么为什么>Datensatz$gender[NAs.a]tableDatensatz$gender,useNA=总是给我带来4倍于2的值呢?0 1 2 279 294 4 0实际上,使用match的第一种方法应该非常有效,为什么您不喜欢它?我喜欢它,但我的数据不是示例数据,我没有得到0和1的值,而是2 4倍的值。我不知道哪里出了问题,因为这两列都只包含0和1。您是否像我在评论中建议的那样尝试了df1[df2,sex:=I.sex][is.nagender,sex:=sex][?这将向您显示两列,以便您可以比较并查看所有内容是否正确匹配。它还将通过引用修改df1.yes,但我得到以下错误:error in:=sex,i.sex:Check It is.data.tableDT==TRUE。否则,:=和:=。。。定义为在j中使用,仅一次,并以特定方式使用。请参阅帮助:=。这是只替换NAs,还是替换整个列?如果要仅替换性别为的NAs,可以执行类似于df1[df2,sex:=i.sex][is.nagender,sex:=sex][]的操作。虽然dplyr的答案也连接了整个列,但似乎您的答案没有问题,谢谢,但当两个向量的长度不同时,这似乎不起作用。