【问题标题】:Extract data from variable based on column heading in R根据R中的列标题从变量中提取数据
【发布时间】:2017-02-07 20:19:37
【问题描述】:

我希望能够基于以下 R 中的示例数据集执行以下操作(实际数据集要长得多,地址要长得多):

|ID|birthyr   |address1990|address1991|address1992|address1993|
|A |1992      |NA         |NA         |2          |2          |
|B |1990      |2          |2          |3          |3          |
|C |1991      |NA         |3          |3          |1          |

我想用他们出生年份的地址值创建一个新列。因此,理想情况下,我会为每个人取birthyr 中的年份,并查看哪个列标题包含此字符串,然后使用该人在该列中的值。我目前有一种方法,请参见下面的代码,但这不是最好的方法,因为它从存在数据的地址的第一列中获取值,我担心这可能会导致数据丢失.

#dat is the dataset

#add empty columns that new values will go in
dat$birth_address<-NA
dat$address_first_year<-NA

#Take first value from address column which contains data and add the value to  birth address and then add the column name to the column address_first_year
J<-seq(3,6,by=1)
for(i in 1:dim(dat)[1]){
    for(j in J){
        if(!is.na(dat[i,j])){
            dat$birth_address[i]<-dat[i,j]
            dat$address_first_year[i]<-names(dat)[j]
            break
        }
    }
}

#remove string from address_first_year column and change years to numeric
dat$address_first_year<-sub("address", "", dat$address_first_year)
dat$address_first_year<-as.numeric(dat$address_first_year)

#remove rows where address_first_year is not equal to birthyr to ensure that values in new column are actually from birthyr
for(i in 1:dim(dat)[1]){
    if(dat$address_first_year[i] != dat$birthyr[i]){
        dat$birth_address[i]<-NA
    }
}

在示例上运行上述代码时,我得到以下结果。虽然这给了我我想要的东西,但我想在某些情况下它不会,因此我想要一种更简洁、更健壮的方式来做到这一点。

  ID birthyr address1990 address1991 address1992 address1993 birth_address address_first_year
1  A    1992          NA          NA           2           2             2               1992
2  B    1990           2           2           3           3             2               1990
3  C    1991          NA           3           3           1             3               1991

编辑:- 根据下面的 cmets 更新 这些是我使用下面的代码得到的结果,但这似乎不是我所期望的。

  ID birthyr address1990 address1991 address1992 address1993 birth_address
1  A    1992          NA          NA           2           2             2
2  B    1990           2           2           3           3             3
3  C    1991          NA           3           3           1             2

谢谢

【问题讨论】:

  • 发布dput(dat)的结果会很有帮助
  • 感谢您的回复我想我已经添加了您要求的内容,如果不是这样,请告诉我

标签: r data-processing


【解决方案1】:

鉴于dat 是您的数据并使用dplyrtidyr

library(dplyr)
library(tidyr)
dat %>% 
  gather(addressYY, value, 3:6) %>% 
  mutate(BirthAdderess = gsub(x = addressYY, 'address', '')) %>% 
  filter(birthyr == BirthAdderess)

【讨论】:

  • 感谢您的回复,我对 R 很陌生,我不完全确定上面的内容。可以给个简单的解释吗?
  • 当然。使用gather 函数,我们将addressYear 列转换为具有地址值的行,使用mutategsub,我们将所有文本(如address1990)转换为数字,然后仅过滤出生年份为与地址年份相同。您可以逐行执行它以了解它的作用。
  • 谢谢,有道理。但是理想情况下,我想保留原始的 addressYY 列,因为稍后我将需要它们。有没有办法做到这一点?
  • 使用此解决方案的最佳做法是使用 merge() 将原始 df 合并到结果中。知道这必须附加到原始 df 上,有人可能会找到更好的解决方案.. 这感觉很“hacky”
  • 不,我喜欢这个。将%&gt;% collect %&gt;% .[["value"]] 添加到末尾,将dat$birth_address &lt;- 添加到开头,这看起来相当健壮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多