【问题标题】:Collapsing multiple columns with repeating values折叠具有重复值的多列
【发布时间】:2021-05-20 17:25:45
【问题描述】:

我目前正在使用以前收集的数据框。参与者种族目前分为几个类别(Race_White、Race_Black 等),其中每个参与者的值为 1 表示是或 2 表示否。例如,不认同任何其他种族的白人参与者将有 1 in Race_White 列和所有其他 Race_X 列中的 2。

我想将这些合并到一个“种族”列中,其中 1 = 白色,2 = 黑色等。有没有人知道一段很好的代码/函数/包可以有效地做到这一点?

这是我一直在尝试的:

Race <- mutate(mydata,
                  Race = case_when(
                    mydata$Race_White = 1 & mydata$Race_Black = 2 & mydata$Race_Asian = 2 & mydata$Race_NoReply = 2 ~ 1, 
                    mydata$Race_White = 2 & mydata$Race_Black = 1 & mydata$Race_Asian = 2 & mydata$Race_NoReply = 2 ~ 2, 
                    mydata$Race_White = 2 & mydata$Race_Black = 2 & mydata$Race_Asian = 1 & mydata$Race_NoReply = 2 ~ 3,
                    mydata$Race_White = 2 & mydata$Race_Black = 2 & mydata$Race_Asian = 2 & mydata$Race_NoReply = 1 ~ 4, 
                    TRUE ~ NA_real_))

【问题讨论】:

  • 如果您在帖子中包含dput(mydata) 会更容易。

标签: r data-manipulation


【解决方案1】:

我会像这样使用pivot_longerstr_remove

tib <- tibble::tibble(#example data
  individual = 1:10,
  race_white = sample(c(0,1), 10, T),
  race_black = 1 - race_white
)
tib %>% 
  dplyr::pivot_longer(dplyr::contains('race')) %>% 
  dplyr::filter(value == 1) %>% 
  dplyr::mutate(
    name = stringr::str_remove(name, 'race_')
  ) %>% 
    dplyr::select(-value, race = name)

如果您希望对它们进行整数编码,您可以在字符列上使用case_when。 但是如果没有示例数据,很难确切知道您想要什么。

这是输出:

# A tibble: 10 x 2
   individual race 
        <int> <chr>
 1          1 white
 2          2 white
 3          3 white
 4          4 white
 5          5 white
 6          6 white
 7          7 black
 8          8 white
 9          9 white
10         10 black

编辑: 我使用 0 = 否,1 = 是。但这并没有改变任何事情。我还为所有函数添加了包符号。

【讨论】:

    【解决方案2】:

    你可以这样做:

      names(df)[max.col(df==1)]
    
     [1] "Race_yellow" "Race_red"    "Race_green"  "Race_red"    "Race_green"  "Race_yellow"
     [7] "Race_red"    "Race_purple" "Race_purple" "Race_yellow" "Race_yellow" "Race_blue"  
    [13] "Race_purple" "Race_red"    "Race_purple"
    

    数据:

    df <- read.table(text = 
      "Race_yellow Race_green Race_purple Race_blue Race_red
    1            1          2           2         2        2
    2            2          2           2         2        1
    3            2          1           2         2        2
    4            2          2           2         2        1
    5            2          1           2         2        2
    6            1          2           2         2        2
    7            2          2           2         2        1
    8            2          2           1         2        2
    9            2          2           1         2        2
    10           1          2           2         2        2
    11           1          2           2         2        2
    12           2          2           2         1        2
    13           2          2           1         2        2
    14           2          2           2         2        1
    15           2          2           1         2        2")
    

    【讨论】:

    • 不是我想要的。您展示的表格看起来更像是“之前”阶段。我添加了一些代码来阐明我在寻找什么。使用此示例,我希望将 Race_Yellow Race_Green 等合并到一个 Race 列中,其中 Race_yellow = 1,race_green = 2 等,在我的样本中总共有 4 个 Race 级别。
    • @Paul 这就是你要找的东西,例如。做as.integer(factor( names(df)[max.col(df==1)]))
    猜你喜欢
    • 2018-04-23
    • 2021-09-03
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多