r - 将分区文件夹列转换为变量

标签 r tidyverse

我想像这样转换数据框:

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/

相关文章:

r - 使用 tidyverse 和 purrr 进行双重嵌套

r - 使用 ftransform 和来自折叠 R 包的 fgroup_by

删除少于 "x"行的列表元素

R向量减法

r - 根据同一变量上的最大值和附加条件对 R 中的数据帧进行子集化

r - 使用 r 设置 x 轴的间隔

r - 删除 y 标签后子图错位

R Shiny : How to select a DataTable page based on a selected row when the row order has changed?

r - 给出由 purrr::map 名称返回的列表

r - 如何以简洁的方式将表达式传递给 filter() 动词?