【发布时间】: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