通过R中名称的开头将二进制变量合并为分组变量

Merge binary variables into grouping variables by the start of the name in R

我有一个像 original 这样的数据集,带有数字 (NP) 和二进制(所有其他)变量(我的数据集要大得多,包括更多的数字和虚拟变量):

NP <- c(4,6,18,1,3,12,8)
iso_mode_USA <- c(1, 0, 0, 0, 0, 1, 1)
iso_mode_CHN <- c(0, 1, 1, 0, 0, 0, 0)
iso_mode_COL <- c(0, 0, 0, 1, 1, 0, 0)
exp_sector_4 <- c(0, 1, 0, 0, 1, 0, 0)
exp_sector_5 <- c(1, 0, 1, 0, 0, 0, 0)
exp_sector_7 <- c(0, 0, 0, 1, 0, 1, 1)
original <- data.frame(NP, iso_mode_USA, iso_mode_CHN, iso_mode_COL, exp_sector_4, exp_sector_5, exp_sector_7)

我想合并二进制变量在名称的开头(例如所有“iso_mode_”在一起,所有“exp_sector_”在一起,等等我数据集中的其余变量未在此处显示)。 在生成的 新变量 中,我想输入 value ,它位于原始变量的 colname() 的 末尾.

所以 new 数据集看起来像:

NP <- c(4,6,18,1,3,12,8)
iso_mode <- c('USA', 'CHN', 'CHN', 'COL', 'COL', 'USA', 'USA')
exp_sector <- c('5', '4', '4', '7', '4', '7', '7')
new <- data.frame(NP,iso_mode, exp_sector)

我试过 following link。然而,它并不能通过名称 select 假人(我的数据集中有大约 1700 个假人,仅属于大约 20 个组)

dplyr() 环境的任何解决方案?

谢谢

一个dplyrpurrr的可能性是:

original %>%
 transmute(NP,
           iso_mode = pmap(across(starts_with("iso")), ~ sub(".*\_", "", names(which(c(...) == 1)))),
           exp_sector = pmap(across(starts_with("exp")), ~ sub(".*\_", "", names(which(c(...) == 1)))))

  NP iso_mode exp_sector
1  4      USA          5
2  6      CHN          4
3 18      CHN          5
4  1      COL          7
5  3      COL          4
6 12      USA          7
7  8      USA          7

以长格式导入数据,仅保留值为 1 的行,将列名拆分为两列,然后以宽格式重新排列数据。

library(dplyr)
library(tidyr)

original %>%
  pivot_longer(cols = -NP) %>%
  filter(value == 1) %>%
  extract(name, c('col', 'val'), '(\w+_\w+)_(\w+)') %>%
  select(-value) %>%
  pivot_wider(names_from = col, values_from = val)

#     NP iso_mode exp_sector
#  <dbl> <chr>    <chr>     
#1     4 USA      5         
#2     6 CHN      4         
#3    18 CHN      5         
#4     1 COL      7         
#5     3 COL      4         
#6    12 USA      7         
#7     8 USA      7