如何使用存储在R中另一个数据帧中的列顺序从数据帧中进行选择?

时间:2019-09-28 16:37:46

标签: 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$X1df2$X1_的子集X1_...中第df2列。 df1$X2df2$X2_的子集X2_...中的第df2列,依此类推。以示例中的第一行为例:df$X1 = 3,所以我需要从df2$X1_3(3d列)中获取元素。这个元素是2。然后是df1$X2 = 1,2,我需要两个元素,第一个来自df2$X2_1,第二个来自df2$X2_2。它们是1和2。所有需要获取的第一行元素我都需要作为单个向量存储在所需列表的第一元素中,依此类推。每一行都如此。

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

[[1]]
[1] 2 1 2

[[2]]
[1] 1 1 2

[[3]]
[1] 1 1

df1由字符变量组成。

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

2 个答案:

答案 0 :(得分:3)

这里是一种选择。 gather(在tidyr 1.0.0-pivot_longer中将被替换)将'df1'转换为'long'格式,然后使用{{在,处拆分'val'列1}},并创建行/列索引,以按行号('rn')从'df2'和separate_rows中提取元素

split

答案 1 :(得分:2)

base 中,您可以先拆分df1$X2,然后通过使用paste创建列名来进行子集划分,例如:

df1[] <- lapply(df1[], as.character)

x <- colnames(df1)
lapply(seq_len(nrow(df1)), function(i) {
  df2[i, unlist(sapply(seq_along(x), function(j) {paste0(x[j], "_", strsplit(df1[i, x[j]], ",")[[1]])}))]
})
#[[1]]
#  X1_3 X2_1 X2_2
#1    2    1    2
#
#[[2]]
#  X1_2 X2_1 X2_3
#2    1    1    2
#
#[[3]]
#  X1_1 X2_1
#3    1    1