取R中两个数据帧之间的差
我一直在寻找一个简单的方法来使用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
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()
使示例重现