我想像这样转换数据框:
mre <- tibble::tribble(
~folder3, ~folder2, ~folder1,
"V3=4", "V2=1", "V1=0",
"V3=5", "V2=1", "V1=0",
"V3=4", "V2=2", "V1=0",
"V3=5", "V2=2", "V1=0",
"V3=4", "V2=1", "V1=1",
"V3=5", "V2=1", "V1=1",
"V3=4", "V2=2", "V1=1",
"V3=5", "V2=2", "V1=1"
)
对此:
folder3 folder2 folder1 V3 V2 V1
V3=4 V2=1 V1=0 4 1 0
V3=5 V2=1 V1=0 5 1 0
V3=4 V2=2 V1=0 4 2 0
V3=5 V2=2 V1=0 5 2 0
V3=4 V2=1 V1=1 4 1 1
V3=5 V2=1 V1=1 5 1 1
V3=4 V2=2 V1=1 4 2 1
V3=5 V2=2 V1=1 5 2 1
基本上提取每个变量的唯一变量名称(此处为“V3,”V2”,“V1”,但可以是任何有效名称,例如“a”,“b”,c“) folder?
column 作为新列名称,并保留值。
通过使用第一行值,我对单个“文件夹”列有以下内容:
mre %>%
tidyr::extract(folder1, into = .$folder1[1] |> word(1, sep="="), "\\S+=(\\d+)", remove = FALSE)
但我不知道如何扩展到多个“文件夹”列(数量不固定)。我尝试按照答案 here 使用 map
,但无法弄清楚如何从第一行获取变量名称。
有什么建议吗?
最佳答案
我们可以在跨
本身内创建新列,而不是提取
- 跨
所有列变异
( everything()
),使用 str_extract
获取 =
之后的数字 (\\d+
),而使用 str_replace
names
中的列名称
library(dplyr)
library(stringr)
mre %>%
mutate(across(everything(),
~ as.numeric(str_extract(., "(?<=\\=)\\d+")),
.names = "{str_replace(.col, 'folder', 'V')}"))
-输出
# A tibble: 8 × 6
folder3 folder2 folder1 V3 V2 V1
<chr> <chr> <chr> <dbl> <dbl> <dbl>
1 V3=4 V2=1 V1=0 4 1 0
2 V3=5 V2=1 V1=0 5 1 0
3 V3=4 V2=2 V1=0 4 2 0
4 V3=5 V2=2 V1=0 5 2 0
5 V3=4 V2=1 V1=1 4 1 1
6 V3=5 V2=1 V1=1 5 1 1
7 V3=4 V2=2 V1=1 4 2 1
8 V3=5 V2=2 V1=1 5 2 1
如果需要从“文件夹”列值中提取列名称,则一种选择是使用 pivot_longer
reshape 为“long”,并使用 separate_rows
拆分列,使用 pivot_wider
重新整形回“宽”,并将列与原始数据绑定(bind)
library(tidyr)
mre %>%
mutate(rn = row_number()) %>%
pivot_longer(cols= starts_with('folder'), names_to = NULL) %>%
separate(value, into = c('name', 'value'), sep="\\=", convert = TRUE) %>%
pivot_wider(names_from = name, values_from = value) %>%
select(-rn) %>%
bind_cols(mre, .)
-输出
# A tibble: 8 × 6
folder3 folder2 folder1 V3 V2 V1
<chr> <chr> <chr> <int> <int> <int>
1 V3=4 V2=1 V1=0 4 1 0
2 V3=5 V2=1 V1=0 5 1 0
3 V3=4 V2=2 V1=0 4 2 0
4 V3=5 V2=2 V1=0 5 2 0
5 V3=4 V2=1 V1=1 4 1 1
6 V3=5 V2=1 V1=1 5 1 1
7 V3=4 V2=2 V1=1 4 2 1
8 V3=5 V2=2 V1=1 5 2 1
关于r - 将分区文件夹列转换为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70440932/