首页 > 解决方案 > 如何使用存储在 R 中另一个数据框中的列顺序从数据框中进行选择?

问题描述

我有两个行数相等的数据框。片段是

df1 <- data.frame(X1 = c('3', '2', '1'), X2 = c('1,2', '1,3', '1'))
df1
  X1  X2
1  3 1,2
2  2 1,3
3  1   1
df2 <- data.frame(X1_1 = c(3, 2, 1), X1_2 = c(1, 1, 2), X1_3 = c(2, 3, 3), X2_1 = c(1, 1, 1), X2_2 = c(2, 3, 3), X2_3 = c(3, 2, 2))
df2
  X1_1 X1_2 X1_3 X2_1 X2_2 X2_3
1    3    1    2    1    2    3
2    2    1    3    1    3    2
3    1    2    3    1    3    2

df1存储df2我需要从中获取元素的列号。df1$X1是的子集中的df2$X1_第 - 列。是子集中的第 -th 列,依此类推。以我的示例中的第一行为例:所以我需要从(3d 列)中获取元素。这个元素是 2。然后我需要取两个元素,第一个 from和第二个 from 。它们是 1 和 2。我需要将第一行的所有获得的元素作为单个向量存储在所需列表的第一个元素中,依此类推。X1_...df2df1$X2df2$X2_X2_...df2df$X1 = 3df2$X1_3df1$X2 = 1,2df2$X2_1df2$X2_2

换句话说,对于上面的片段,我需要一个列表

[[1]]
[1] 2 1 2

[[2]]
[1] 1 1 2

[[3]]
[1] 1 1

df1由字符变量组成。

如何在 R 中创建这个元素列表?

标签: r

解决方案


这是一种选择。 gather(在tidyr 1.0.0-pivot_longer将是一个替换)'df1' 到 'long' 格式,然后将 'val' 列拆分为,,并创建一个行/列索引以从 'df2' 和行separate_rows中提取元素split数字('rn')

library(dplyr)
library(tidyr)
library(tibble)
d1 <- df1 %>% 
       rownames_to_column('rn') %>%
       gather(key, val, -rn) %>%
       #pivot_longer(-rn, names_to= "key", values_to = "val") %>%
       separate_rows(val) %>%
       unite(key, key, val)
split(df2[cbind(as.numeric(d1$rn), match(d1$key, names(df2)))], d1$rn)
#$`1`
#[1] 2 1 2

#$`2`
#[1] 1 1 2

#$`3`
#[1] 1 1

推荐阅读