【问题标题】:Merge binary variables into grouping variables by the start of the name in R通过R中名称的开头将二进制变量合并为分组变量
【发布时间】:2021-06-13 13:02:38
【问题描述】:

我有一个类似 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_”一起,依此类推我在数据集中的变量未在此处提供)。 在生成的新变量中,我想输入,它位于原始变量的 colname() 的末尾

所以新的数据集看起来像:

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。但是,按名称选择假人并不能成为诀窍(我的数据集中有大约 1700 个假人,仅属于大约 20 个组)

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

谢谢

【问题讨论】:

    标签: r merge grouping r-caret dummy-variable


    【解决方案1】:

    以长格式获取数据,仅保留值为 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         
    

    【讨论】:

    • 谢谢!我的图书馆里有 dplyr 和 tidyr。但是,由于以下错误,您的第 4 行无法在我的计算机中运行 (extract().....):Extract(., name, c("col", "val"), "(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ w+_\\w+)_(\\w+)") : texreg 和 broom 都不支持 tbl_df 类的模型。
    • 您正在使用来自其他库的extract。使用带有tidyr::extract的代码
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2018-07-18
      • 2022-07-11
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      相关资源
      最近更新 更多