我有两个数据行,行数相等。该代码段是
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_
的子集X1_...
中第df2
列。 df1$X2
是df2$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中创建此元素列表?
答案 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