通过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() 环境的任何解决方案?
谢谢
一个dplyr
和purrr
的可能性是:
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
我有一个像 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() 环境的任何解决方案?
谢谢
一个dplyr
和purrr
的可能性是:
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