首页 > 解决方案 > R:如何简单地比较 2 个数据框中列的值

问题描述

我正在比较两个数据框:FUFO 以下是它们的外观的简短示例

"Model_ID" "FU_Lin_Period" "FU_Growth_rate"
2 0.72127 0.0093333
3 0.69281 0.015857
4 0.66735 0.021103
5 0.64414 0.024205
6 0.62288 0.026568
7 0.60318 0.027749
8 0.58472 0.028161
9 0.56734 0.028008
10 0.55085 0.027309
11 0.53522 0.026068
12 0.52029 0.024684
13 0.50603 0.022866
14 0.49237 0.020991
15 0.47928 0.018773
"Model_ID" "FO_Lin_Period" "FO_Growth_rate"
7 0.44398 0.008868
8 0.43114 0.01674
9 0.41896 0.023248
10 0.40728 0.028641
11 0.39615 0.032192
12 0.38543 0.03543
13 0.37517 0.03692
14 0.36525 0.038427
15 0.35573 0.038195

如您所知,它们并不完全相同Model_ID

基本上,我想要做的是遍历Model_ID两个表中的每一个,比较给定模型 ID 的 FU 或 FO 的增长率是否更大,然后......

有没有办法在不使用循环的情况下做到这一点?

标签: r

解决方案


data.table替代使用与tidyverse答案类似的逻辑。

NAs替换为-Infinity,做两个FU/FO_Growth_rate变量的比较,标记哪个组的值较大,然后将 s 选Model_ID入请求的变量中。

library(data.table)
setDT(FU)
setDT(FO)

out <- merge(FU, FO, by="Model_ID", all=TRUE)[,
    "gr_sel" := c("FO","FU")[(nafill(FU_Growth_rate, fill=-Inf) >
                              nafill(FO_Growth_rate, fill=-Inf)) + 1],
]
selected_FU <- out[gr_sel == "FU", Model_ID]
selected_FO <- out[gr_sel == "FO", Model_ID]

使用的数据:

FU <- read.table(text="Model_ID FU_Lin_Period FU_Growth_rate\n2 0.72127 0.0093333\n3 0.69281 0.015857\n4 0.66735 0.021103\n5 0.64414 0.024205\n6 0.62288 0.026568\n7 0.60318 0.027749\n8 0.58472 0.028161\n9 0.56734 0.028008\n10 0.55085 0.027309\n11 0.53522 0.026068\n12 0.52029 0.024684\n13 0.50603 0.022866\n14 0.49237 0.020991\n15 0.47928 0.018773", header=TRUE)
FO <- read.table(text="Model_ID FO_Lin_Period FO_Growth_rate\n7 0.44398 0.008868\n8 0.43114 0.01674\n9 0.41896 0.023248\n10 0.40728 0.028641\n11 0.39615 0.032192\n12 0.38543 0.03543\n13 0.37517 0.03692\n14 0.36525 0.038427\n15 0.35573 0.038195", header=TRUE)

推荐阅读