r - 根据来自另一个 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)
解决方案
这可以使用 -package 中的一个来实现regex_join
,fuzzyjoin
我使用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
推荐阅读
- javascript - React Native 添加到购物车数量和总价问题
- java - Eclipse 中的 Ant 需要 tools.jar,但 Java 9/10 中没有 tools.jar
- html - 如何在矩形中画圆
- node.js - 创建后从设备 JSON 为 Azure IoT 中心生成连接字符串
- python - 使用python有效地压缩文件
- python - 如何使 jupyter pythreejs 绘图更大?
- javascript - Javascript EventListener 事件延迟?
- android - 如何获取类的上下文
- facebook - 如何在 2FA 中使用 Facebook OAuth2
- php - setup-config.php 进入第 1 步,然后返回 403 禁止