【问题标题】:Reshaping Data Wide To Long: New variables based on Column Names将数据从宽变长:基于列名的新变量
【发布时间】:2020-06-19 09:19:36
【问题描述】:

我想将数据集从宽格式重塑为长格式。

数据集包含 300 个变量,每个变量都以原理命名:ModelID_Emotion_ModelGender。以下示例数据:

df <- structure(list(X71_Anger_Male = structure(c(3L, 1L, 2L), .Label = c("Anger", 
"Disgust", "Fear"), class = "factor"), X71_Disgus_Male = structure(c(2L, 
1L, 1L), .Label = c("Disgust", "Fear"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

看起来像

  X71_Anger_Male X71_Disgus_Male
1           Fear            Fear
2          Anger         Disgust
3        Disgust         Disgust

我想以将列名中的信息获取并放入新变量的方式转置数据。例如,应该有一个新变量ModelGender,一个新变量modelID和一个新变量emotion。所以数据集应该是这样的:

desired <- structure(list(Gender = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Male", class = "factor"), 
    ModelNumber = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "X71", class = "factor"), 
    Emotion = structure(c(2L, 2L, 2L, 1L, 1L, 1L), .Label = c("Anger", 
    "Disgust"), class = "factor"), Response = structure(c(3L, 
    2L, 2L, 3L, 1L, 2L), .Label = c("Anger", "Disgust", "Fear"
    ), class = "factor")), class = "data.frame", row.names = c(NA, 
-6L))

应该是这样的

  Gender ModelNumber Emotion Response
1   Male         X71 Disgust     Fear
2   Male         X71 Disgust  Disgust
3   Male         X71 Disgust  Disgust
4   Male         X71   Anger     Fear
5   Male         X71   Anger    Anger
6   Male         X71   Anger  Disgust

当我使用 reshape、gather/spread 或 melt/cast 时,它不会给出预期的结果。有没有人知道如何做到这一点?

感谢您的宝贵时间!

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以简单地转换为 long 并拆分您想要的列。一种通过 tidyverse 方法的方法可以是,

    library(dplyr)
    library(tidyr)
    
    df %>% 
     pivot_longer(everything()) %>% 
     separate(name, into = c('ModelNumber', 'Emotion', 'Gender'), sep = '_')
    

    【讨论】:

    • 我什至相信一切都可以在pivot_longer() 内完成,使用names_tonames_sep-arguments.. 有任何理由使用separate 作为单独的行吗?
    【解决方案2】:

    pivot_longer 中,您可以将names_sep 指定为"_" 并将列名拆分为3 列。

    tidyr::pivot_longer(df, cols = everything(),
                            names_to = c('ModelNumber', 'Emotion', 'Gender'), 
                            values_to = 'Response',
                            names_sep = '_')
    
    # A tibble: 6 x 4
    #  ModelNumber Emotion Gender Response
    #  <chr>       <chr>   <chr>  <fct>   
    #1 X71         Anger   Male   Fear    
    #2 X71         Disgus  Male   Fear    
    #3 X71         Anger   Male   Anger   
    #4 X71         Disgus  Male   Disgust 
    #5 X71         Anger   Male   Disgust 
    #6 X71         Disgus  Male   Disgust 
    

    【讨论】:

    • 我刚刚注意到这不会保存有关参与者的任何信息(即参与者ID)。 ParticipantID 当然有一个最初单独的列(只是命名为“ID”)。您将如何修改代码以将 ID 变量放入“长”数据框中?
    • @Max 我在你的dput 中看不到participantID。也许,您需要cols = -participantID 而不是cols = everything()
    • 解决了,完美,非常感谢您的帮助!
    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多