R语言 根据列中的共享字符串名称按行从2个数据框中减去值

zfciruhq  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(155)

我想从两个不同的 Dataframe 中减去。我有一个 Dataframe 中有信息,另一个有“参考点”。
我有一个 Dataframe DF 1,其中包含此信息。
| 姓名|关键词|细胞粘附分子12 A|ACA1|右旋糖酐2|
| - ------|- ------|- ------|- ------|- ------|
| X_1组1|测试1234|十个|十个|八个|
| X_2组1|测试4553|八个|七|四个|
| X_2组2|测试3341|五个|五个|五个|
| X_2组1|测试2142|五个|六个|八个|
| X_1组2|测试4722|六个|七|四个|
使用DF 1,我想将DF 2(下面)的行减去特定行中的值,但是基于第一列的数值匹配。
例如,基于下面的DF 2,我在DF2$Name中有一个字符串X_1_group1。在DF 1中,第一行的第一列中有相同的字符串。由于名称匹配,我将从DF 2中的DF 1的该行中减去该行中的值。请注意,DF 1中可能有多个字符串具有相同的名称,因此我希望能够以这种方式匹配名称。
| 姓名|关键词|细胞粘附分子12 A|ACA1|右旋糖酐2|
| - ------|- ------|- ------|- ------|- ------|
| X_1组1|X_1组1_A|第二章|第二章|1个|
| X_2组1|X_1组1_B|1个|三个|1个|
| X_1组2|X_1组1_C|第二章|第二章|三个|
| X_2组2|X_1组1_D|第二章|1个|第二章|
DF 3(这是目标)-第二列,通过不同将保持相同的匹配DF 1。
| 姓名|关键词|细胞粘附分子12 A|ACA1|右旋糖酐2|
| - ------|- ------|- ------|- ------|- ------|
| X_1组1|测试1234|八个|八个|七|
| X_2组1|测试4553|七|四个|三个|
| X_2组2|测试3341|三个|四个|三个|
| X_2组1|测试2142|四个|三个|七|
| X_1组2|测试4722|四个|五个|1个|
任何关于减法的两个数据框的名称匹配的帮助都将非常感谢。我还想概括这一点,将有比这个例子更多的列,所以任何考虑到这一部分的东西也会有很大的帮助!感谢任何帮助!

# DF1
Name <- c("X_1_group1", "X_2_group1", "X_2_group2", "X_2_group1", "X1_group2")
Key <- c("test1234", "test4553", "test3341", "test2142", "test4722")
BCD12A <- c(10, 8, 5, 5, 6)
ACA1 <- c(10, 7, 5, 6, 7)
DEX2 <- c(8, 4, 5, 8, 4)
DF1 <- data.frame(Name, Key, BCD12A, ACA1, DEX2)

# DF2
Name <- c("X_1_group1", "X_2_group1", "X_1_group2", "X_2_group2")
Key <- c("X_1_group1_A", "X_1_group1_B", "X_1_group1_C", "X_1_group1_D")
BCD12A <- c(2, 1, 2, 2)
ACA1 <- c(2, 3, 2, 1)
DEX2 <- c(1, 1, 3, 2)
DF2 <- data.frame(Name, Key, BCD12A, ACA1, DEX2)
cu6pst1q

cu6pst1q1#

我们可以使用'Key'连接并减去相应的数字列。使用powerjoin,我们可以选择在有conflict ing名称(常用名称)的地方获得差值(-

library(powerjoin)
library(dplyr)
DF1 %>%
    power_left_join(DF2 %>% select(-Key), by = "Name", conflict = `-`)
  • 输出
Name      Key BCD12A ACA1 DEX2
1 X_1_group1 test1234      8    8    7
2 X_2_group1 test4553      7    4    3
3 X_2_group2 test3341      3    4    3
4 X_2_group1 test2142      4    3    7
5 X_1_group2 test4722      4    5    1

或者使用data.table连接

library(data.table)
nm1 <- names(DF1)[3:5]
nm2 <- paste0("i.", nm1)
setDT(DF1)[DF2, (nm1) := Map(`-`, mget(nm1), mget(nm2)), on = .(Name)]

相关问题