【发布时间】:2015-04-25 04:06:24
【问题描述】:
我希望这个不是愚蠢的。
我有两个带有变量 ID 和性别/性别的数据框。在 df1 中,有 NA。在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",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")
非常感谢。
【问题讨论】:
-
好的,我遇到了这个问题:
table(Datensatz$gender, useNA="always")带来 0/1/NA 然后table(sampleframe$sex)有 0/1。那么> Datensatz$gender[NAs.a] <- sampleframe[match(Datensatz$ID[NAs.a], sampleframe$ID),]$sex > table(Datensatz$gender, useNA="always")怎么给我带来了 4 倍的值“2”? 0 1 2279 294 4 0 -
其实你用
match的第一个方法应该很有效,为什么不喜欢呢? -
我喜欢它,但是对于我的数据(不是示例数据),我没有得到 0 和 1 的值,还有 2(4 次)。我不知道哪里出了问题,因为两列都只包含 0 和 1。
-
您是否尝试过
df1[df2, sex := i.sex][is.na(gender), gender := sex][],就像我在 cmets 中建议的那样?这将向您显示两列,以便您可以比较并查看所有内容是否正确匹配。它还将通过引用修改df1。 -
是的,但我收到此错误:
:=(sex, i.sex) 中的错误:检查 is.data.table(DT) == TRUE。否则,:= 和:=(...) 被定义为在 j 中使用,仅一次且以特定方式使用。请参阅帮助(“:=”)。