我有以下两个数据框。 数据框 1:
篮子 | 苹果 | 香蕉 | 柑橘 |
---|---|---|---|
1 | C01 | A03 | 二氧化碳 |
2 | A01 | B02 | C03 |
3 | B01 | A02 | B03 |
数据框 2 的行名称标记为 A-C,列名称标记为 1-3。
我如何能够从数据帧 1 中读取元素,并将它们映射到数据帧 2 中各自的单元格中。例如,如果 df1 中的元素读取为 C01,它将使用以下字符串打印到数据框 2 行 C 列 1 中:'Apple1'(篮子 1 中的苹果)。
最终目标示例:
0 | 1 | 2 | 3 |
---|---|---|---|
A | 苹果2 | 香蕉3 | 香蕉1 |
B | 苹果3 | 香蕉2 | 柑橘3 |
C | 苹果1 | 柑橘1 | 柑橘2 |
答案 0 :(得分:4)
我们使用“篮子”以外的列将数据重新整形为“长”格式,separate
通过在非数字部分和数字部分之间的连接处将“值”列一分为二,{{1 }} 'name' 列与 'Basket' 并用 unite
pivot_wider
-输出
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = -Basket) %>%
separate(value, into = c('col1', 'col2'),
sep="(?<=\\D)(?=\\d)", convert = TRUE) %>%
unite(name, name, Basket, sep="") %>%
arrange(col2, col1) %>%
pivot_wider(names_from = col2, values_from = name)
# A tibble: 3 x 4
# col1 `1` `2` `3`
# <chr> <chr> <chr> <chr>
#1 A Apple2 Banana3 Banana1
#2 B Apple3 Banana2 Citrus3
#3 C Apple1 Citrus1 Citrus2
答案 1 :(得分:2)
使用 data.table
+ dcast
的 melt
选项
dcast(
melt(setDT(df1),
id.var = "Basket"
)[
,
variable := paste0(variable, Basket)
],
gsub("\\d", "", value) ~ gsub("\\D", "", value),
value.var = "variable"
)
给予
value 01 02 03
1: A Apple2 Banana3 Banana1
2: B Apple3 Banana2 Citrus3
3: C Apple1 Citrus1 Citrus2