首页 > 解决方案 > 根据来自另一个 data.table 的信息计算数据表上的行

问题描述

不确定如何查找文档。

我设法完成了工作,但不确定如何寻找我正在尝试做的操作和/或是否有更好的方法来做。

我有一个按类型列出的变量列表。对于每种类型的变量,都有一组“纯”变量名,我将其命名为种子

示例:种子:

> seed
   S_TYPE    NAMESS
1:      A      var1
2:      A      var2
3:      B      var3
4:      B    var1_1
5:      C     var_3
6:      C var_1_1_1
7:      C   var_2_1

变量列表:

   S_TYPE       NAMESS_MOD
1:      A       A_var1_2_1
2:      A       A_var1_3_3
3:      A         A_var2_4
4:      B         B_var1_1
5:      B          B_var_3
6:      C   C_var_1_1_1_LN
7:      C C_var_1_1_1_PLUS

我正在寻找每个变量的“种子”。问题是 S_TYPE 发挥作用,可以有不同的类型和不同的种子

示例:种子

   S_TYPE    NAMESS
1:      A      var1
2:      A      var2
3:      B      var3
4:      B    var1_1
5:      C     var_3
6:      C var_1_1_1
7:      C   var_2_1

变量

   S_TYPE       NAMESS_MOD
1:      A       A_var1_2_1
2:      A       A_var1_3_3
3:      A         A_var2_4
4:      B         B_var1_1
5:      B          B_var_3
6:      C   C_var_1_1_1_LN
7:      C C_var_1_1_1_PLUS

根据 S_TYPE 有不同的种子我的目标是得到这个结果:

   S_TYPE       NAMESS_MOD real_seed
1:      A       A_var1_2_1      var1
2:      A       A_var1_3_3      var1
3:      A         A_var2_4      var2
4:      B         B_var1_1    var1_1
5:      B          B_var_3      <NA>
6:      C   C_var_1_1_1_LN var_1_1_1
7:      C C_var_1_1_1_PLUS var_1_1_1

我使用了这段代码,因为我没有找到其他方法:

seed <- data.table(S_TYPE = c("A","A","B","B", "C","C","C"),
                    NAMESS = c("var1","var2","var3","var1_1",
                               "var_3","var_1_1_1","var_2_1")
                    );seed
modifiedseed <- data.table(S_TYPE = c("A","A","A","B","B", "C","C"),
                           NAMESS_MOD = c("A_var1_2_1","A_var1_3_3","A_var2_4",
                                      "B_var1_1","B_var_3",
                                      "C_var_1_1_1_LN","C_var_1_1_1_PLUS")
                           );modifiedseed
split_seed <- split(seed, seed[,S_TYPE])
split_modifiedseed <- split(modifiedseed, modifiedseed[,S_TYPE])
split_modifiedseed$A[, real_seed := str_extract( split_modifiedseed$A[, NAMESS_MOD], str_c( split_seed$A[, NAMESS], collapse= "|"))]
split_modifiedseed$B[, real_seed := str_extract( split_modifiedseed$B[, NAMESS_MOD], str_c( split_seed$B[, NAMESS], collapse= "|"))]
split_modifiedseed$C[, real_seed := str_extract( split_modifiedseed$C[, NAMESS_MOD], str_c( split_seed$C[, NAMESS], collapse= "|"))
rbindlist(split_modifiedseed)

标签: rdata.table

解决方案


这可以使用 -package 中的一个来实现regex_joinfuzzyjoin我使用data.table-package 只是为了读取示例数据并创建 data.frames。data.frame当您已经获得-format 的数据时,不需要它。

创建样本数据

library( data.table )

seed <- data.table::fread("S_TYPE    NAMESS
A      var1
A      var2
B      var3
B    var1_1
C     var_3
C var_1_1_1
C   var_2_1")

VARIABLES <-  data.table::fread("S_TYPE       NAMESS_MOD
A       A_var1_2_1
A       A_var1_3_3
A         A_var2_4
B         B_var1_1
B          B_var_3
C   C_var_1_1_1_LN
C C_var_1_1_1_PLUS")

#create data.frames
data.table::setDF( seed )
data.table::setDF( VARIABLES )

带有 regex_join 的代码

library( fuzzyjoin )
fuzzyjoin::regex_left_join( VARIABLES, seed, by = c( S_TYPE = "S_TYPE", NAMESS_MOD = "NAMESS" ))

输出

#   S_TYPE.x       NAMESS_MOD S_TYPE.y    NAMESS
# 1        A       A_var1_2_1        A      var1
# 2        A       A_var1_3_3        A      var1
# 3        A         A_var2_4        A      var2
# 4        B         B_var1_1        B    var1_1
# 5        B          B_var_3     <NA>      <NA>
# 6        C   C_var_1_1_1_LN        C var_1_1_1
# 7        C C_var_1_1_1_PLUS        C var_1_1_1

推荐阅读