基于匹配R中相同数据帧中的两个列ID来创建新列

时间:2014-01-04 05:04:30

标签: r replace match

我正在尝试在同一数据框中将一列与另一列匹配。它看起来像:

vl<-read.csv("/Users/ToNoY/Documents/R/data.csv",
             stringsAsFactors=FALSE,header=TRUE)

>head(vl)

       old_ID  Sample_Date  DOC
1 001-2009-II 054-2009-II  1.44 
2 002-2009-II 030-2009-II  1.55  
3 005-2009-II 031-2009-II    NA  
4 006-2009-II 005-2009-II  1.89  
5 030-2009-II 004-2009-II  2.03  
6 054-2009-II 002-2009-II  1.43  
... ...

我想创建一个新列,通过将'old_ID'与'Sample_Date'匹配来插入'DOC'列值。换句话说,上面的列应该如下所示:

       old_ID  Sample_Date  DOC  New
1 001-2009-II 054-2009-II  1.44   NA
2 002-2009-II 030-2009-II  1.55   NA
3 005-2009-II 031-2009-II    NA 1.89
4 006-2009-II 005-2009-II  1.89   NA
5 030-2009-II 004-2009-II  2.03 1.55
6 054-2009-II 002-2009-II  1.43 1.44
... ...

2 个答案:

答案 0 :(得分:1)

您所描述的是数据库合并(特别是左外连接)。这可以通过merge函数完成:

df = data.frame(old_ID=c("001-2009-II", "002-2009-II", "005-2009-II", "006-2009-II", "030-2009-II", "054-2009-II"),
                Sample_Date=c("054-2009-II", "030-2009-II", "031-2009-II", "005-2009-II", "004-2009-II", "002-2009-II"),
                DOC=c(1.44, 1.55, NA, 1.89, 2.03, 1.43))
merged = merge(df, df, by.x="old_ID", by.y="Sample_Date", all.x=TRUE)
new.df = data.frame(old_ID=merged$old_ID, Sample_Date=merged$Sample_Date,
                    DOC=merged$DOC.x, New=merged$DOC.y)
new.df
#        old_ID Sample_Date  DOC  New
# 1 001-2009-II 054-2009-II 1.44   NA
# 2 002-2009-II 030-2009-II 1.55 1.43
# 3 005-2009-II 031-2009-II   NA 1.89
# 4 006-2009-II 005-2009-II 1.89   NA
# 5 030-2009-II 004-2009-II 2.03 1.55
# 6 054-2009-II 002-2009-II 1.43 1.44

答案 1 :(得分:1)

## df <-  read.table(text="      old_ID  Sample_Date  DOC
## 1 001-2009-II 054-2009-II  1.44 
## 2 002-2009-II 030-2009-II  1.55  
## 3 005-2009-II 031-2009-II    NA  
## 4 006-2009-II 005-2009-II  1.89  
## 5 030-2009-II 004-2009-II  2.03  
## 6 054-2009-II 002-2009-II  1.43 ", header=TRUE)

library(qdap)
df[, "NEW"] <- df[, 1] %l% df[, -1]
df

##        old_ID Sample_Date  DOC  NEW
## 1 001-2009-II 054-2009-II 1.44   NA
## 2 002-2009-II 030-2009-II 1.55 1.43
## 3 005-2009-II 031-2009-II   NA 1.89
## 4 006-2009-II 005-2009-II 1.89   NA
## 5 030-2009-II 004-2009-II 2.03 1.55
## 6 054-2009-II 002-2009-II 1.43 1.44

这相当快(特别是在较大的数据集上)并且几乎不需要编码。