2

我有两个具有相同 3 列的数据框:WeekNum、Year 和 Number。

A <- data.frame(WeekNum=c(1,2,3,4,5,1,2,3,4,5), 
                Year=c(2000,2000,2000,2000,2000,2001,2001,2001,2001,2001), 
                Number=c(0,0,0,0,0,0,0,0,0,0))

B <- data.frame(WeekNum=c(1,2,3,4,1,2,6), 
                Year=c(2000,2000,2000,2000,2001,2001,2001), 
                Number=c(0,1,0,1,2,5,6))

我想使用 A 中的所有 WeekNum 和 Year 组合创建一个具有相同 3 列的新数据框(并且只有 B 中也存在于 A 中的那些)。当 B 中也存在 WeekNum 和 Year 组合时,我想使用 B 中的 Number 值。如果 B 中不存在该组合,我想将 Number 值保留为 0。最终,我应该有一个数据框好像:

> C
   WeekNum Year Number
1        1 2000      0
2        2 2000      1
3        3 2000      0
4        4 2000      1
5        5 2000      0
6        1 2001      2
7        2 2001      5
8        3 2001      0
9        4 2001      0
10       5 2001      0
4

2 回答 2

4

一种简单的方法是id为两个 data.frames 创建一个列AB然后使用match

A$id <- paste(A$WeekNum, A$Year, sep=":")
B$id <- paste(B$WeekNum, B$Year, sep=":")

m1 <- match(A$id, B$id)
m2 <- which(!is.na(m1))
A$Number[m2] <- B$Number[m1[!is.na(m1)]]
subset(A, select=-c(id))

输出:(Edit:我看到你改变了你的输入data.frame

   WeekNum Year Number
1        1 2000      0
2        2 2000      1
3        3 2000      0
4        4 2000      1
5        5 2000      0
6        1 2001      2
7        2 2001      5
8        3 2001      0
9        4 2001      0
10       5 2001      0
于 2013-01-03T21:44:51.893 回答
0

以前@Arun 的答案的变体:

根据需要将数据绑定在一起:

result <- rbind(
 A[!(paste(A$WeekNum, A$Year, sep=":") %in% paste(B$WeekNum, B$Year, sep=":")),],
 B[paste(B$WeekNum, B$Year, sep=":")   %in% paste(A$WeekNum, A$Year, sep=":"),]
)

排序以获得正确的顺序:

result <- result[order(result$Year,result$WeekNum),]

    WeekNum Year Number
51        1 2000      0
6         2 2000      1
7         3 2000      0
81        4 2000      1
5         5 2000      0
91        1 2001      2
101       2 2001      5
8         3 2001      0
9         4 2001      0
10        5 2001      0
于 2013-01-04T03:41:57.760 回答