【问题标题】:How can I vertically join multiple columns from the same data set?如何垂直连接同一数据集中的多个列?
【发布时间】:2023-02-04 15:36:46
【问题描述】:

我有一个包含三列年龄变量和两列活动状态的数据集。我想以一列显示年龄,一列显示活动状态。我想通过匹配相同的案例并保留不同的案例来做到这一点。

这是可重现数据的示例

df <- structure(list(fruits = c(0, 0, 0, 0, 1), veggies = c(0, 1, 1, 
                                                            1, 1), age = structure(c(7L, 8L, 9L, 10L, 6L), levels = c("1", 
                                                                                                                      "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"
                                                            ), class = "factor"), under30 = structure(c(1L, 1L, 1L, 1L, 1L
                                                            ), levels = c("30 plus", "under 30"), class = "factor"), age30to64 = structure(c(2L, 
                                                                                                                                             2L, 2L, 1L, 2L), levels = c("under 30 or 65 plus", "age 30 to 64"
                                                                                                                                             ), class = "factor"), age65plus = structure(c(1L, 1L, 1L, 2L, 
                                                                                                                                                                                           1L), levels = c("under 65", "65 plus"), class = "factor"), arthritis = structure(c(1L, 
                                                                                                                                                                                                                                                                              2L, 1L, 1L, 1L), levels = c("No arthritis", "Arthritis"), class = "factor"), 
                     gender = structure(c(2L, 2L, 2L, 1L, 2L), levels = c("male", 
                                                                          "female"), class = "factor"), genhealth = structure(c(3L, 
                                                                                                                                3L, 2L, 3L, 2L), levels = c("Excellent", "Very good", "Good", 
                                                                                                                                                            "Fair", "Poor"), class = "factor"), education = structure(c(5L, 
                                                                                                                                                                                                                        6L, 4L, 6L, 6L), levels = c("1", "2", "3", "4", "5", "6"), class = "factor"), 
                     income = structure(c(8L, 8L, 7L, 6L, 8L), levels = c("1", 
                                                                          "2", "3", "4", "5", "6", "7", "8"), class = "factor"), active = structure(c(2L, 
                                                                                                                                                      1L, 2L, 1L, 2L), levels = c("Not active", "Active"), class = "factor"), 
                     active1 = structure(c(2L, 1L, 2L, 1L, 3L), levels = c("Low", 
                                                                           "Moderate", "Vigorous"), class = "factor"), bmi = c(18.2199993133545, 
                                                                                                                               27.4599990844727, 21.9699993133545, 35.939998626709, 39.8600006103516
                                                                           ), bmicat = structure(c(1L, 3L, 2L, 4L, 4L), levels = c("Underweight", 
                                                                                                                                   "Normal", "Overweight", "Obese"), class = "factor"), activetimes = c(20, 
                                                                                                                                                                                                        0, 5, 0, 8), ageCat = structure(c(2L, 2L, 2L, 3L, 2L), levels = c("under30", 
                                                                                                                                                                                                                                                                          "age30to64", "over64"), class = "factor")), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                    -5L), class = c("tbl_df", "tbl", "data.frame"))

我尝试了多种功能,例如粘贴和联合,但没有得到预期的结果。我期望的是单个垂直年龄列和单个垂直活动列。相同的案例需要匹配,不同的案例需要保留。

【问题讨论】:

  • 您的可重现数据不可重现。
  • 我做了一些编辑。这次应该工作

标签: r join merge multiple-columns


【解决方案1】:

像这样:

library(dplyr)
library(tidyr)

df %>% 
  select(age, active, active1) %>% 
  pivot_longer(-age,
               names_to = 'name', 
               values_to = 'active_status') %>% 
  distinct(active_status, .keep_all = TRUE) %>% 
  select(-name)
 age   active_status
  <fct> <fct>        
1 7     Active       
2 7     Moderate     
3 8     Not active   
4 8     Low          
5 6     Vigorous

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2017-10-04
    相关资源
    最近更新 更多