取R中两个数据帧之间的差

取R中两个数据帧之间的差,r,dataframe,R,Dataframe,我一直在寻找一个简单的方法来使用R,但是我找不到,所以我把它贴在这里 假设我有以下数据帧 state1 score1 state2 score2 A 1 A 3 A 2 B 13 A 1 C 5 B 10 A 1 B

我一直在寻找一个简单的方法来使用R,但是我找不到,所以我把它贴在这里

假设我有以下数据帧

 state1     score1     state2    score2
   A          1          A          3
   A          2          B          13
   A          1          C          5
   B          10         A          1
   B          5          B          0
   B          3          C          0
   C          2          A          5
   C          0          B          6
   C          1          C          3
第二个数据帧是

 state1     state2    score
   A          A         0
   A          B         -1
   A          C         3
   B          A         2
   B          B         1
   B          C         1
   C          A         2
   C          B         2
   C          C         1
让我们调用第一个数据帧df1,并调用第二个边距df2

看看具有相同(state1,state2)对的df1,df2。 对于每个匹配对,从df1中的score1中减去df2中的score并称之为newscore1,从df2中的score2中减去df2中的score并称之为newscore2。对于这种情况,需要以下输出

 state1   newscore1    state2    newscore2
   A          1          A          3
   A          3          B          14
   A          -2         C          2
   B          8          A          -1
   B          4          B          -1
   B          2          C          -1
   C          0          A          3
   C          -2         B          4
   C          0          C          2
是否有一个/两个线性解决方案? 否则,我就不得不这样做

1) 对df2重新排序,使state1、state2与df1匹配(在本例中,我不必做任何事情,因为df1中的行1已与df2中的行1匹配,df1中的行2已与df2中的行2匹配,依此类推)


2) cbind df1$score1-df2$score,df1$score2-df2$score

最干净的方法是使用联接操作。为此,我喜欢
dplyr
。例如:

state1 <- gl(3, k=3, labels=c("A", "B", "C"))
score1 <- sample(1:10, size = 9, replace = TRUE)
state2 <- gl(3, k=1, length=9, labels=c("A", "B", "C"))
score2 <- sample(1:10, size = 9, replace = TRUE)
df1 <- data.frame(state1, score1, state2, score2)
state1-df2
州1州2分
1 A-1
2 A B 1
3 A C-2
4 B A 5
5 B B 5
6 B C 5
7 C A 0
8 C B-1
9 C-3
组合_df%
#按state1和state2排列df1和df2,并将它们组合起来
完全联接(df2,by=c(“state1”,“state2”))%>%
#计算所需的新列
变异(newscore1=score1-score,newscore2=score2-score)%>%
#删除多余的列
选择(state1、newscore1、state2、newscore2)
>联合测向
state1新闻核心1 state2新闻核心2
1 A 4 A 7
2 A 7 B 1
3 A 5 C 8
4 B-3 A 3
5 B-2 B 5
6 B-2 C 1
7c7a2
8C10B6
9c9c13

最干净的方法是使用联接操作。为此,我喜欢
dplyr
。例如:

state1 <- gl(3, k=3, labels=c("A", "B", "C"))
score1 <- sample(1:10, size = 9, replace = TRUE)
state2 <- gl(3, k=1, length=9, labels=c("A", "B", "C"))
score2 <- sample(1:10, size = 9, replace = TRUE)
df1 <- data.frame(state1, score1, state2, score2)
state1-df2
州1州2分
1 A-1
2 A B 1
3 A C-2
4 B A 5
5 B B 5
6 B C 5
7 C A 0
8 C B-1
9 C-3
组合_df%
#按state1和state2排列df1和df2,并将它们组合起来
完全联接(df2,by=c(“state1”,“state2”))%>%
#计算所需的新列
变异(newscore1=score1-score,newscore2=score2-score)%>%
#删除多余的列
选择(state1、newscore1、state2、newscore2)
>联合测向
state1新闻核心1 state2新闻核心2
1 A 4 A 7
2 A 7 B 1
3 A 5 C 8
4 B-3 A 3
5 B-2 B 5
6 B-2 C 1
7c7a2
8C10B6
9c9c13

只需将两者合并,然后逐列减去:

dfm <- merge(df1, df2, by=c("state1", "state2"))
dfm$newscore1 <- dfm$score1 - dfm$score
dfm$newscore2 <- dfm$score2 - dfm$score

dfm <- dfm[c("state1", "newscore1", "state2", "newscore2")]

dfm只需将两者合并并逐列减去:

dfm <- merge(df1, df2, by=c("state1", "state2"))
dfm$newscore1 <- dfm$score1 - dfm$score
dfm$newscore2 <- dfm$score2 - dfm$score

dfm <- dfm[c("state1", "newscore1", "state2", "newscore2")]

dfm使用
库(data.table)
的单行程序

执行join(正如其他解决方案所建议的那样),然后使用updatebyreference操作符(
:=
)在一个步骤中添加新列

df1[ df2, on = c("state1","state2"), `:=`(newscore1 = score1 - score, newscore2 = score2 - score)]
df1
#    state1 score1 state2 score2 newscore1 newscore2
# 1:      A      1      A      3         1         3
# 2:      A      2      B     13         3        14
# 3:      A      1      C      5        -2         2
# 4:      B     10      A      1         8        -1
# 5:      B      5      B      0         4        -1
# 6:      B      3      C      0         2        -1
# 7:      C      2      A      5         0         3
# 8:      C      0      B      6        -2         4
# 9:      C      1      C      3         0         2

使用
库(data.table)
的单行程序

执行join(正如其他解决方案所建议的那样),然后使用updatebyreference操作符(
:=
)在一个步骤中添加新列

df1[ df2, on = c("state1","state2"), `:=`(newscore1 = score1 - score, newscore2 = score2 - score)]
df1
#    state1 score1 state2 score2 newscore1 newscore2
# 1:      A      1      A      3         1         3
# 2:      A      2      B     13         3        14
# 3:      A      1      C      5        -2         2
# 4:      B     10      A      1         8        -1
# 5:      B      5      B      0         4        -1
# 6:      B      3      C      0         2        -1
# 7:      C      2      A      5         0         3
# 8:      C      0      B      6        -2         4
# 9:      C      1      C      3         0         2

当使用
sample
时,您还应该使用
set.seed()
使示例重现当使用
sample
时,您还应该使用
set.seed()
使示例重现