我正在尝试在同一数据框中将一列与另一列匹配。它看起来像:
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
... ...
答案 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
这相当快(特别是在较大的数据集上)并且几乎不需要编码。