首页 文章

如何在R中的同一数据集中将一个观察的变量附加到另一个观察

提问于
浏览
1

我的问题如下:

假设我有一个人年的数据集,其中包含有关婚姻状况(cStatus),种族,年份,配偶身份证(pID)和居住城市的信息:

data<-data.frame(cbind(c(rep(1,5),rep(2,5),rep(3,5),rep(4,5),rep(5,5)),c(rep(c(1,2,3,4,5),5)),c(NA,NA,NA,NA,NA,NA,NA,3,3,NA,NA,NA,2,2,7,6,6,6,6,6,NA,NA,NA,NA,NA),c(0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0),c(1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1),c(rep(1,5),rep(1,2),rep(2,3),rep(2,4),1,rep(1,5),rep(1,5))))
names(data)<- c("id","year","pID","cStatus","race","city")

> head(data)  
id year pID cStatus race city
 1    1    NA       0    1    1
 1    2    NA       0    1    1
 1    3    NA       0    1    1
 1    4    NA       0    1    1
 1    5    NA       0    1    1
 2    1    NA       0    1    1

我想为每次观察为配偶的种族(pRace)创建一个变量 . 我试图通过在数据集中搜索其他观察“B”来为给定的观察“A”做这个,其中“id”具有与观察“A”的“pID”相同的值并且指定“B”s“种族”到“A”的pRace .

我想过循环:

for(i in unique(data$id)){
  data[data$id==i,]$pRace <-ifelse(data[data$id==i,]$cStatus==1,data[data$id==data[data$id==i,]$pID,]$race,NA)
}

除了非常丑陋之外,这还产生:

Warning messages:
1: In `[<-.data.frame`(`*tmp*`, data$id == i, , value = list(id = c(1,  :
  provided 8 variables to replace 7 variables

这样做有什么办法吗?我是否以正确的方式尝试使用循环?

1 回答

  • 3
    # create a dataframe that has unique entries for each person and their race
    spouses <- unique(data[c("id", "race")])
    names(spouses) <- c("pID", "pRace")
    
    # merge race via spouse id
    data <- merge(data, spouses, by="pID", all.x=TRUE)
    

    这使:

    > data
       pID id year cStatus race city pRace
    1    2  3    4       1    0    2     1
    2    2  3    3       1    0    2     1
    3    3  2    4       1    1    2     0
    4    3  2    3       1    1    2     0
    5    6  4    2       1    0    1    NA
    6    6  4    1       1    0    1    NA
    7    6  4    3       1    0    1    NA
    8    6  4    5       1    0    1    NA
    9    6  4    4       1    0    1    NA
    10   7  3    5       1    0    1    NA
    11  NA  1    1       0    1    1    NA
    12  NA  1    2       0    1    1    NA
    [...]
    

    请注意,如果 pID 本身不存在于数据中(没有相应的 id )或者没有配偶,则会获得NA .

    如果您想要考虑多年来更改配偶,只需在辅助数据框和 merge 参数中添加年份 . 就像@joran指出的那样, merge 可以接受多个列进行合并,类似于SQL .

    # create a dataframe that has unique entries for each person and their race
    spouses.yearly <- unique(data[c("id", "year", "race")])
    names(spouses.yearly) <- c("pID", "pRace")
    
    # merge race via spouse id
    data <- merge(data, spouses.yearly, by=c("pID", "year"), all.x=TRUE)
    

相关问题