r - 合并非关键变量的所有 "occurrences"

标签 r merge data.table outer-join

我有两个数据集,我想要的可能被松散地称为“非关键变量的外部连接”。

这是数据集

数据集 1

oc  oc2 state_id    r_state 
A011    A01 1808    1.00    
A011    A01 1810    0.50    
A012    A01 1810    0.50    
A011    A01 1814    0.33    
A012    A01 1814    0.33    
A013    A01 1814    0.33    

数据集 2
oc  r_country
A011    0.62
A012    0.14
A013    0.24

我想要的输出如下:
oc  oc2 state_id    r_state r_country
A011    A01 1808    1.00    0.62
A012    A01 1808    NA      0.14
A013    A01 1808    NA      0.24
A011    A01 1810    0.50    0.62
A012    A01 1810    0.50    0.14
A013    A01 1810    NA      0.24
A011    A01 1814    0.33    0.62
A012    A01 1814    0.33    0.62
A013    A01 1814    0.33    0.24

请注意行号 2、3 和 6 是如何“人工”引入的。我的问题是如何在 R 中做到这一点。如果我通过 oc 合并, merge函数不会创建这些行。如果我通过 oc2 合并,它将创建不必要的额外行。请注意 oc2只是 oc 的更高级别编码.下面是几行代码,用于在 data.tables 中获取上述数据集。请注意,这些是样本数据集,实际数据包含大约 50 个不同的 oc2和每个 oc2可以有 1 到 9 oc在里面。此外,还有 47 个不同的州。
DT1 = data.table(oc = c('A011','A011','A012','A011','A012','A013'),
                 oc2 = rep('A01',6),
                 state_id = c(1808,1810,1810,1814,1814,1814),
                 r_state = c(1, 0.5,0.5,0.33,0.33,0.33)
                )

DT2 = data.table(oc = c('A011','A012','A013'), 
                  r_country = c(0.62, 0.14, 0.24)
                )

虽然我正在使用 data.table , 基地 data.frame解决方案也行。

最佳答案

使用:

library(zoo) # for the 'na.locf'-function

DT1[CJ(oc = oc, state_id = state_id, unique = TRUE), on = .(oc, state_id)
    ][order(state_id), oc2 := na.locf(oc2), by = 'state_id'
      ][DT2, on = 'oc', r_country := r_country][order(state_id)]

给出:

     oc oc2 state_id r_state r_country
1: A011 A01     1808    1.00      0.62
2: A012 A01     1808      NA      0.14
3: A013 A01     1808      NA      0.24
4: A011 A01     1810    0.50      0.62
5: A012 A01     1810    0.50      0.14
6: A013 A01     1810      NA      0.24
7: A011 A01     1814    0.33      0.62
8: A012 A01     1814    0.33      0.14
9: A013 A01     1814    0.33      0.24


根据@Frank 的建议,您也可以在不使用 na.locf 的情况下执行此操作来自 zoo -包裹:
DT1[CJ(oc = oc, state_id = state_id, unique = TRUE), on = .(oc, state_id)
    ][DT2, on = .(oc), r_country := i.r_country][DT1, on = .(state_id), oc2 := i.oc2][]

关于r - 合并非关键变量的所有 "occurrences",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47901426/

相关文章:

r - 如何检查 stopCluster (R) 是否有效

在 R 中读取远程文件系统上存储的 netCDF 文件?

Android list 合并 - 来自库项目的不同启动器 Activity

r - 在 data.table 列中分割文本字符串

r - 在 R 中用 data.table 对许多列求和,删除 NA

R如何有选择地对数据框进行排序?

R相当于Matlab spy 功能

r - 在两个公共(public)列 R 的匹配值上连接两个数据帧

ruby-on-rails - merge 2 个 Rails App 子目录,保留 git 历史

R 将非常大的数据表列表合并到一个 data.table 中