在 R 中将列转换为宽格式的单独列

问题描述 投票:0回答:1

我正在尝试将“水果”列转换为宽格式的单独列(“苹果”和“香蕉”)。

  Gender  AgeGroup              EAT           FRUITS 
1 Female 30yr_39yr              Yes             Apple           
2 Female 20yr_29yr              Yes             Apple              
3 Female 70yr_80yr              Yes             Apple             
4   Male 50yr_59yr              Yes             Banana              
5 Female 40yr_49yr              Yes             Apple                  
6 Female 70yr_80yr              Yes             Apple              

如何将 FRUITS 栏转换为:

  Gender AgeGroup       EAT  Apple      Banana 
1 Female 30yr_39yr      Yes  TRUE      FALSE
2 Female 20yr_29yr      Yes  TRUE      FALSE
3 Female 70yr_80yr      Yes  TRUE      FALSE
4   Male 50yr_59yr      Yes  FALSE     TRUE
5 Female 40yr_49yr      Yes  TRUE      FALSE
6 Female 70yr_80yr      Yes  TRUE      FALSE

这是我使用的数据框:

data.frame(
  Gender = c("Female", "Female", "Female", "Male", "Female", "Female"),
  AgeGroup = c("30yr_39yr", "20yr_29yr", "70yr_80yr", "50yr_59yr", "40yr_49yr", "70yr_80yr"),
  EAT = c("Yes", "Yes", "Yes", "Yes", "Yes", "Yes"),
  FRUITS = c("Apple", "Apple", "Apple", "Banana", "Apple", "Apple")
)
r tidyverse tidyr
1个回答
1
投票

您必须向数据集添加一个值列,并为每行添加一个具有唯一 ID 的列:

df <- data.frame(
  Gender = c("Female", "Female", "Female", "Male", "Female", "Female"),
  AgeGroup = c("30yr_39yr", "20yr_29yr", "70yr_80yr", "50yr_59yr", "40yr_49yr", "70yr_80yr"),
  EAT = c("Yes", "Yes", "Yes", "Yes", "Yes", "Yes"),
  FRUITS = c("Apple", "Apple", "Apple", "Banana", "Apple", "Apple")
)

library(tidyr)
library(dplyr, warn = FALSE)

df |>
  mutate(
    value = TRUE,
    id = row_number()
  ) |>
  pivot_wider(
    names_from = FRUITS,
    values_from = value, values_fill = FALSE
  ) |>
  select(-id)
#> # A tibble: 6 × 5
#>   Gender AgeGroup  EAT   Apple Banana
#>   <chr>  <chr>     <chr> <lgl> <lgl> 
#> 1 Female 30yr_39yr Yes   TRUE  FALSE 
#> 2 Female 20yr_29yr Yes   TRUE  FALSE 
#> 3 Female 70yr_80yr Yes   TRUE  FALSE 
#> 4 Male   50yr_59yr Yes   FALSE TRUE  
#> 5 Female 40yr_49yr Yes   TRUE  FALSE 
#> 6 Female 70yr_80yr Yes   TRUE  FALSE
© www.soinside.com 2019 - 2024. All rights reserved.