2

同じ3つの列(WeekNum、Year、Number)を持つ2つのデータフレームがあります。

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の組み合わせ(およびAにも存在するBの組み合わせのみ)を使用して、同じ3列の新しいデータフレームを作成したいと思います。WeekNumとYearの組み合わせがBにも存在する場合、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の列を作成してAからB、次を使用すること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 に答える