R 根据id列中的公共值从另一个数据帧中减去数据帧的行

R 根据id列中的公共值从另一个数据帧中减去数据帧的行,r,dataframe,R,Dataframe,我有两个数据帧: > head(df1) UG S N_l N_b Girder1 Girder2 Girder3 Girder4 Girder5 Girder6 Girder7 Source 1 84 12 6 7 6 6 6 6 6 6 6 Code 2 124 9 4 7 4 4 4 4 3

我有两个数据帧:

> head(df1)
    UG  S N_l N_b Girder1 Girder2 Girder3 Girder4 Girder5 Girder6 Girder7 Source
1   84 12   6   7       6       6       6       6       6       6       6   Code
2  124  9   4   7       4       4       4       4       3       3       3   Code
9   84  9   4   7       4       4       4       4       3       3       3   Code
24 124 12   6   7       6       6       6       6       6       6       6   Code
45 124 15   8   7       8       8       8       8       8       7       3   Code
49  84 15   8   7       8       8       8       8       8       7       3   Code

> head(df2)
  UG  S N_b N_l Girder1 Girder2 Girder3 Girder4 Girder5 Girder6 Girder7 Source
1 84  9   5   3      NA       2       3       3       3       2      NA    CSi
2 84 12   5   4      NA       2       3       4       3       3      NA    CSi
3 84 15   5   5      NA       3       3       5       3       3      NA    CSi
4 92  9   5   3      NA       2       3       3       3       2      NA    CSi
5 92 12   5   4      NA       2       3       4       3       3      NA    CSi
6 92 15   5   5      NA       3       3       5       3       3      NA    CSi
当我想看到以主梁开始的列的两个数据帧之间的差异时

lanes.difference <- df2[5:11]-df1[5:11]

正如@Kay所建议的,我以相同的方式对两个数据帧进行排序。我不确定是否有较短的路

order.S <- c(9,12,15)
df1 <- df1[order(match(df1$S, order.S)), ]
order.UG <- c(84,92,100,108,116,124)
df1 <- df1[order(match(df1$UG, order.UG)), ]
order.N_b <- c(5,7)
df1 <- df1[order(match(df1$N_b, order.N_b)), ]
lanes.difference <- df2[5:11]-df1[5:11]

order.S首先,我鼓励您查看
tidyverse
套餐。按名称调用dataframe列不是一个很好的实践,不管您是使用BaseR还是某些包

除此之外,还有许多其他软件包对数据处理有巨大帮助,请用谷歌搜索你喜欢的软件包

library(tidyverse)
首先,我将
df
名称作为其各自列名的前缀

colnames(df1) <- paste("df1", colnames(df1), sep = "_")
colnames(df2) <- paste("df2", colnames(df2), sep = "_")
你可以通过谷歌
mutate
filter
来了解它们的工作原理


这花了一些时间,但希望能有所帮助

你能用dput()在这里发布你的df,这样我们就可以重新创建它了吗question@Kay刚刚编辑了原来的帖子!两个数据帧之间是否存在1-1匹配,也就是说,如果您只是按四个关键列对两个数据帧进行排序,然后执行您最初所做的操作
df2_排序[5:11]-df1_排序[5:11]
是的,我试图问这个问题,有没有更短的方法?
colnames(df1) <- paste("df1", colnames(df1), sep = "_")
colnames(df2) <- paste("df2", colnames(df2), sep = "_")
df12 <- cbind(df1, df2)
df12 %>% filter(df1_UG == df2_UG | df1_S == df2_S | df1_N_l == df2_N_l | df1_N_b == df1_N_b) %>% 
mutate(Girder2Diff = df1_Girder2 - df2_Girder2)