【问题标题】:R: reshape dataframe from wide to long format based on compound column namesR:根据复合列名将数据框从宽格式重塑为长格式
【发布时间】:2017-11-25 10:09:31
【问题描述】:

我有一个数据框,其中包含两组数据(A,B)的观察结果,数据集和观察类型由列名给出:

mydf <- data.frame(meta1=paste0("a",1:2), meta2=paste0("b",1:2), 
                   A_var1 = c(11:12), A_var2 = c("p","r"), 
                   B_var1 = c(21:22), B_var2 = c("x","z"))

我想重塑这个数据框,使每一行只包含对一组的观察。在这种长格式中,集合和列名应该通过在“_”处拆分原始列名来给出:

mydf2 <- data.frame(meta1=rep(paste0("a",1:2),2), 
                  meta2=rep(paste0("b",1:2),2),
                  set=c("A","B","A","B"),
                  var1 = c(11:12),
                  var2 = c("a","b","c","d"))

我曾尝试将 'gather' 与 'str_split'、'sub' 结合使用,但不幸的是没有成功。这可以使用潮汐函数来完成吗?

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    是的,您可以通过 tidyverse 做到这一点!

    你很亲密,你需要gather,然后是separate,然后是spread

    new_df <- mydf %>%
      gather(set, vars, 3:6) %>%
      separate(set, into = c('set', 'var'), sep = "_") %>%
      spread(var, vars)
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢!奇迹般有效。但是,它确实会生成两条警告消息: 1:度量变量之间的属性不相同;它们将被删除 2:使用 ... 将参数传递给 strsplit() 已失效。有什么方法可以避免这些生成?
    • 很高兴为您提供帮助。所以我得到了同样的错误。第一个是因为您的 A_var1、A_var2 等列都是因子和数字。它强迫他们进入角色,因为它不能混合他们。您可以通过首先将这些列更改为 character 来避免这种情况。但这没关系。我意识到的第二个错误是因为我在separate 中使用了by = ,而不是sep = 。我刚刚编辑了它,即使它们都有效。 sep = 是正确的。如果您愿意,请在您接受答案的情况下勾选复选框!谢谢。
    • 谢谢。将第二个短语更改为 'gather(set, vars, contains("_"))' 使解决方案更加通用。
    猜你喜欢
    • 2020-10-23
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多