如何在R数据集中将多个列合并为一个?

3

我正在尝试将R中的多个列合并成一个。

My data looks like this:
      age gender a     b     c     d     e     f     race  insured 
 1     13 Female 0     0     0     0     0     0     white 0      
 2     12 Female 0     0     0     0     0     0     white 1      
 3     19 Male   0     0     0     0     0     1     other 0      
 4     19 Female 0     1     0     0     0     0     white 0      
 5     13 Female 1     1     0     0     0     1     white 0   

这就是我想要的输出:

      age gender   race  insured value
 1     13 Female   white 0        none    
 2     12 Female   white 1        none
 3     19 Male     other 0        f
 4     19 Female   white 0        b
 5     13 Female   white 0        a
 5     13 Female   white 0        b
 5     13 Female   white 0        f

我尝试使用gather创建一个长数据框,但这并不像我想要的那样将数据添加到数据框中。我该如何使用dplyr或tidyverse包来做到这一点?


查找 cbind - DeBARtha
3个回答

3

另一种方法

df <- read.table(text = ' row_num     age gender a     b     c     d     e     f     race  insured 
 1     13 Female 0     0     0     0     0     0     white 0      
 2     12 Female 0     0     0     0     0     0     white 1      
 3     19 Male   0     0     0     0     0     1     other 0      
 4     19 Female 0     1     0     0     0     0     white 0      
 5     13 Female 1     1     0     0     0     1     white 0', header = T)

df
#>   row_num age gender a b c d e f  race insured
#> 1       1  13 Female 0 0 0 0 0 0 white       0
#> 2       2  12 Female 0 0 0 0 0 0 white       1
#> 3       3  19   Male 0 0 0 0 0 1 other       0
#> 4       4  19 Female 0 1 0 0 0 0 white       0
#> 5       5  13 Female 1 1 0 0 0 1 white       0
library(tidyverse)

nm <- c('a', 'b', 'c', 'd', 'e', 'f')
df %>% mutate(across(a:f, as.logical)) %>%
  nest(value = c(a, b, c, d, e, f)) %>% 
  mutate(value = map(value, ~ ifelse(length(nm[unlist(.)]) == 0, 
                                      'none', 
                                      paste(unlist(nm[unlist(.)]), collapse = ',')
                                      )
                     )) %>%
  unnest(value) %>% 
  separate_rows(value, sep = ',')
#> # A tibble: 7 x 6
#>   row_num   age gender race  insured value
#>     <int> <int> <chr>  <chr>   <int> <chr>
#> 1       1    13 Female white       0 none 
#> 2       2    12 Female white       1 none 
#> 3       3    19 Male   other       0 f    
#> 4       4    19 Female white       0 b    
#> 5       5    13 Female white       0 a    
#> 6       5    13 Female white       0 b    
#> 7       5    13 Female white       0 f

该内容是由reprex包(v2.0.0)于2021-11-16创建的。


1

使用 tidyverse 解决方案。最终输出为 dat4

library(tidyverse)

dat2 <- dat %>%
  mutate(ID = 1:n())

dat3 <- dat2 %>%
  pivot_longer(a:f, names_to = "value", values_to = "number") %>%
  filter(number == 1) %>%
  select(-number)

dat4 <- dat2 %>%
  left_join(dat3) %>%
  select(-ID, -c(a:f)) %>%
  replace_na(list(value = "none"))

dat4
#   age gender  race insured value
# 1  13 Female white       0  none
# 2  12 Female white       1  none
# 3  19   Male other       0     f
# 4  19 Female white       0     b
# 5  13 Female white       0     a
# 6  13 Female white       0     b
# 7  13 Female white       0     f

数据

dat <- read.table(text = "      age gender a     b     c     d     e     f     race  insured 
 1     13 Female 0     0     0     0     0     0     white 0      
 2     12 Female 0     0     0     0     0     0     white 1      
 3     19 Male   0     0     0     0     0     1     other 0      
 4     19 Female 0     1     0     0     0     0     white 0      
 5     13 Female 1     1     0     0     0     1     white 0",
                  header = TRUE)

这个非常好用!谢谢!@www - Bcohen

-2

(不允许评论,也是一个相对较新的用户)

您提供的信息非常少。 如果您只想合并列,请查看合并命令, 使用此命令,您需要按列名将两个数据框(df1和新的Column1)绑定在一起,首先向您的数据框添加一个具有正确名称的空列,然后合并它们:

names(df1)[11]<- "Value"
New_df <- merge(df1,Column1, by = "Value")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接