匹配 Dataframe 列表中的值,并在R中的其他 Dataframe 中提取

rks48beu  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(181)

我是R的新编程人员,我正在为实验室创建脚本。
我有一个 Dataframe 列表,称为:"单元类型1"、"单元类型2"、...... Dataframe 内部如下所示:
cell_type_1:
| ID|Name|X|Y|
| - ------|- ------|- ------|- ------|
| 01|DAP+|15|98|
| 01|DAP+|x1米11米1x|68|
| 01|DAP+|34|05|
cell_type_2:
| ID|Name|x1米20英寸1x|Y|
| - ------|- ------|- ------|- ------|
| 02|Cer+|25|94|
| 02|Cer+|43|68|
| x1米30英寸1x|Cer+|77|22|
等等。
我想比较列表中所有 Dataframe 的X列和Y列,匹配的 Dataframe 将以如下方式将其信息导出到另一个新 Dataframe :
cell_type_n:
| ID|Name|X|Y|
| - ------|- ------|- ------|- ------|
| x1米39英寸|x1米40英寸1x|43|68|
| n|DAP+Cer+|36|75|
cell_type_m:
| ID|Name|x1米50英寸|Y|
| - ------|- ------|- ------|- ------|
| m|DAP+Cer+Other+|22|11|
| m|DAP+Cer+Other+|58|89|
在R里怎么做?
谢谢。
正如我所说,我几乎不是新来的,所以我试过的东西都不起作用。

9gm1akwq

9gm1akwq1#

使用base R。由于您正在处理一个 Dataframe 列表,并希望比较它们的组合(comb),因此需要一个外部apply。使用df_list中名为“A”-“D”的4个 Dataframe 的玩具示例。
vec是指示匹配项的逻辑向量。使用paste连接名称。

Dataframe 列表
df_list
$A
  ID Name  X  Y
1  1 DAP+ 15 98
2  1 DAP+ 43 68
3  1 DAP+ 34  5

$B
  ID Name  X  Y
1  2 Cer+ 25 94
2  2 Cer+ 43 68
3  2 Cer+ 77 22

$C
  ID Name  X  Y
1  2 Cer+ 25 94
2  2 Cer+ 43 68
3  2 Cer+ 77 22

$D
  ID Name  X  Y
1  1 DAP+ 15 98
2  1 DAP+ 43 68
3  1 DAP+ 34  5
comb <- data.frame(combn(1:length(df_list), 2))
names(comb) <- apply(combn(names(df_list), 2), 2, paste, collapse="")

apply(comb, 2, function(x){
  vec <- df_list[[x[1]]]$X == df_list[[x[2]]]$X & 
           df_list[[x[1]]]$Y == df_list[[x[2]]]$Y;
  data.frame(ID = df_list[[x[1]]][vec, "ID"], 
             Name = paste0(df_list[[x[1]]]$Name[vec], 
                           df_list[[x[2]]]$Name[vec]), 
             df_list[[x[2]]][vec, c("X", "Y")])})
$AB
  ID     Name  X  Y
2  1 DAP+Cer+ 43 68

$AC
  ID     Name  X  Y
2  1 DAP+Cer+ 43 68

$AD
  ID     Name  X  Y
1  1 DAP+DAP+ 15 98
2  1 DAP+DAP+ 43 68
3  1 DAP+DAP+ 34  5

$BC
  ID     Name  X  Y
1  2 Cer+Cer+ 25 94
2  2 Cer+Cer+ 43 68
3  2 Cer+Cer+ 77 22

$BD
  ID     Name  X  Y
2  2 Cer+DAP+ 43 68

$CD
  ID     Name  X  Y
2  2 Cer+DAP+ 43 68
数据
df_list <- list(A = structure(list(ID = c(1L, 1L, 1L), Name = c("DAP+", 
"DAP+", "DAP+"), X = c(15L, 43L, 34L), Y = c(98L, 68L, 5L)), 
class = "data.frame", row.names = c(NA, 
-3L)), B = structure(list(ID = c(2L, 2L, 2L), Name = c("Cer+", 
"Cer+", "Cer+"), X = c(25L, 43L, 77L), Y = c(94L, 68L, 22L)), 
class = "data.frame", row.names = c(NA, 
-3L)), C = structure(list(ID = c(2L, 2L, 2L), Name = c("Cer+", 
"Cer+", "Cer+"), X = c(25L, 43L, 77L), Y = c(94L, 68L, 22L)), 
class = "data.frame", row.names = c(NA, 
-3L)), D = structure(list(ID = c(1L, 1L, 1L), Name = c("DAP+", 
"DAP+", "DAP+"), X = c(15L, 43L, 34L), Y = c(98L, 68L, 5L)), 
class = "data.frame", row.names = c(NA, 
-3L)))

相关问题