簡體   English   中英

如何在 R 數據集中將多列合並為一列?

[英]How can I combine multiple columns into one in an R dataset?

我正在嘗試將 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 包執行此操作?

使用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)

另一種方式

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 日創建

(不允許發表評論,也是一個相當新的用戶)

你給它的信息非常少。 如果您只想合並列,請查看合並命令,使用此命令您需要按列名綁定兩者(您的 df1 和新的 Column1),首先將具有正確名稱的空列添加到您的數據框中,然后將它們合並:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM