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

我想像这样转换数据框:

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

https://stackoverflow.com/questions/70440932/

相关文章:

python - 压缩文件 : Check for correct Password

regex - 只查找多行 C 注释,不查找单行 C 注释

nuget - nuget 的 GitHub Packages 服务身份验证问题

reactjs - 为什么 npm uninstall -g create-react-app 失败

r - 构建组中所有值的列表并应用于整个组

r - 计算数据框中给定变量的均值和标准差

go - Golang 中的全局变量

android - 在 Jetpack Compose 中调用分页数据的刷新方法无法正常工作

typescript - TypeScript 中的泛型类型参数 T 是什么?

google-cloud-platform - 关于 Google Cloud Pub/Sub 消息