R 将多列压缩为单列,基于该列具有值

R 将多列压缩为单列,基于该列具有值,r,tidyverse,R,Tidyverse,我正试图将一些数据以倍数压缩为一列,根据哪一列具有特定值。下面是一个我如何手动操作的示例。我现在需要对更大的列组执行此操作。有没有更明智的方法?如果可能的话,我想要一个简洁的答案 data <- structure(list( `Race: (choice=Asian)` = c("Unchecked", "Unchecked", "Unchecked", "Unchecked", "U

我正试图将一些数据以倍数压缩为一列,根据哪一列具有特定值。下面是一个我如何手动操作的示例。我现在需要对更大的列组执行此操作。有没有更明智的方法?如果可能的话,我想要一个简洁的答案

data <- structure(list(
  `Race: (choice=Asian)` = c("Unchecked", "Unchecked", 
    "Unchecked", "Unchecked", "Unchecked", "Unchecked"),
  `Race: (choice=Black)` = c("Unchecked", 
    "Unchecked", "Unchecked", "Unchecked", "Checked", "Checked"), 
  `Race: (choice=White)` = c("Checked", "Checked", "Checked", 
    "Unchecked", "Unchecked", "Unchecked"),
  `Race: (choice=Other)` = c("Unchecked", 
    "Unchecked", "Unchecked", "Checked", "Unchecked", "Unchecked"
), ID = 1:6), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

data$race=NA_character_
data[data$`Race: (choice=Other)`=="Checked",]$race="Other"
data[data$`Race: (choice=White)`=="Checked",]$race="White"
data[data$`Race: (choice=Black)`=="Checked",]$race="Black"
data[data$`Race: (choice=Asian)`=="Checked",]$race="Asian"

这样做的问题是,我需要手动确定与列名匹配的列id。我还担心它对数据顺序的更改可能不可靠。

您可以使用
max.col
获取每行中第一次出现的
'Checked'

cols <- grep('Race', names(data), value = TRUE)
values <- cols[max.col(data[cols] == 'Checked', ties.method = 'first')]
values
#[1] "Race: (choice=White)" "Race: (choice=White)" "Race: (choice=White)"
#[4] "Race: (choice=Other)" "Race: (choice=Black)" "Race: (choice=Black)"

cols您可以使用
max.col
来获取每行中第一次出现的
'Checked'

cols <- grep('Race', names(data), value = TRUE)
values <- cols[max.col(data[cols] == 'Checked', ties.method = 'first')]
values
#[1] "Race: (choice=White)" "Race: (choice=White)" "Race: (choice=White)"
#[4] "Race: (choice=Other)" "Race: (choice=Black)" "Race: (choice=Black)"

cols尝试这种
tidyverse
方法重塑数据,然后加入:

library(tidyverse)
#Code
datan <- data %>% left_join(
  data %>% pivot_longer(-ID) %>%
    mutate(var=gsub(')','',ifelse(value=='Checked',sub('.*=', '', name),NA))) %>%
    filter(!is.na(var)) %>% select(ID,var))
库(tidyverse)
#代码
数据%n左\u加入(
数据%>%pivot\u更长(-ID)%%>%
变异(var=gsub(')','',ifelse(value=='Checked',sub('.*=','',name),NA))%>%
过滤器(!is.na(var))%>%select(ID,var))
输出:

# A tibble: 6 x 6
  `Race: (choice=Asia~ `Race: (choice=Blac~ `Race: (choice=Whit~ `Race: (choice=Oth~    ID var  
  <chr>                <chr>                <chr>                <chr>               <int> <chr>
1 Unchecked            Unchecked            Checked              Unchecked               1 White
2 Unchecked            Unchecked            Checked              Unchecked               2 White
3 Unchecked            Unchecked            Checked              Unchecked               3 White
4 Unchecked            Unchecked            Unchecked            Checked                 4 Other
5 Unchecked            Checked              Unchecked            Unchecked               5 Black
6 Unchecked            Checked              Unchecked            Unchecked               6 Black
#一个tible:6 x 6
`种族:(choice=Asia)~`Race:(choice=Blac)~`Race:(choice=Whit)~`Race:(choice=Oth~ID变量
1未选中1白色
2未选中2白色
3未选中3白色
4未选中4其他
5未选中未选中5黑色
6未选中未选中6黑色

尝试这种
tidyverse
方法重塑数据,然后加入:

library(tidyverse)
#Code
datan <- data %>% left_join(
  data %>% pivot_longer(-ID) %>%
    mutate(var=gsub(')','',ifelse(value=='Checked',sub('.*=', '', name),NA))) %>%
    filter(!is.na(var)) %>% select(ID,var))
库(tidyverse)
#代码
数据%n左\u加入(
数据%>%pivot\u更长(-ID)%%>%
变异(var=gsub(')','',ifelse(value=='Checked',sub('.*=','',name),NA))%>%
过滤器(!is.na(var))%>%select(ID,var))
输出:

# A tibble: 6 x 6
  `Race: (choice=Asia~ `Race: (choice=Blac~ `Race: (choice=Whit~ `Race: (choice=Oth~    ID var  
  <chr>                <chr>                <chr>                <chr>               <int> <chr>
1 Unchecked            Unchecked            Checked              Unchecked               1 White
2 Unchecked            Unchecked            Checked              Unchecked               2 White
3 Unchecked            Unchecked            Checked              Unchecked               3 White
4 Unchecked            Unchecked            Unchecked            Checked                 4 Other
5 Unchecked            Checked              Unchecked            Unchecked               5 Black
6 Unchecked            Checked              Unchecked            Unchecked               6 Black
#一个tible:6 x 6
`种族:(choice=Asia)~`Race:(choice=Blac)~`Race:(choice=Whit)~`Race:(choice=Oth~ID变量
1未选中1白色
2未选中2白色
3未选中3白色
4未选中4其他
5未选中未选中5黑色
6未选中未选中6黑色

这也是一个很好的答案;感谢您展示了另一种方法。最终,我选择了tidyverse答案,因为它更适合我的工作流程。这也是一个很好的答案;感谢您展示了另一种方法。最终,我选择了tidyverse答案,因为它更适合我的工作流程。