【问题标题】:New columns based on a column modalities and other columns基于列模式和其他列的新列
【发布时间】:2021-10-12 12:49:41
【问题描述】:

我找不到这个问题的答案,但也许我用了错误的关键字,如果是这种情况,请提前道歉。 基本上我有一个看起来像这样的数据框:

  code class Var1 Var2
1   U1     A    1    3
2   U2     A    5   43
3   U1     B    6    3
4   U2     B    6   12
5   U1     C   87    7
6   U2     C    1    8

可以使用以下代码重现:

df <- data.frame(code=c("U1","U2","U1","U2","U1","U2"),class = c("A","A","B","B","C","C"), Var1 = c(1,5,6,6,87,1), Var2 = c(3,43,3,12,7,8))

我想通过基于“类”列模式和其他列创建新列来使其看起来像这样,同时保持“代码”列不变:

  Code Var1.A Var2.A Var1.B Var2.B Var1.C Var2.C
1   U1      1      3      6      3     87      7
2   U2      5     43      6     12      1      8

第二个数据帧可以使用这一行来重现:

df2 <- data.frame(Code=c("U1","U2"),Var1.A = c(1,5), Var2.A = c(3,43), Var1.B = c(6,6),Var2.B=c(3,12),Var1.C=c(87,1),Var2.C=c(7,8))

请注意,我的真实数据框比本示例中的数据框长得多,我可能需要一个自动化解决方案

非常感谢!

【问题讨论】:

    标签: r dataframe reshape tidyr


    【解决方案1】:

    您可以使用以下解决方案。在这种情况下,我们使用glue 语法来创建自定义列名。 .value 指的是我为值选择的列名,class 是先前存储在 class 列中的值,它们之间有一个文字点 .,如下所示:

    library(tidyr)
    
    df %>%
      pivot_wider(names_from = "class", values_from = c("Var1", "Var2"), 
                  names_glue = "{.value}.{class}")
    
    # A tibble: 2 x 7
      code  Var1.A Var1.B Var1.C Var2.A Var2.B Var2.C
      <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
    1 U1         1      6     87      3      3      7
    2 U2         5      6      1     43     12      8
    

    【讨论】:

    • 是的! 5秒太迟了。恭喜!
    • 哈哈,快来发表你的答案吧,这对我来说是一个美好的一天:D
    • 这与我从您之前的帖子中了解到的 glue 事情是一对一的。这是完美的,因为它是我的朋友!
    • 非常感谢,非常抱歉 :)
    • 谢谢,这是因为我有一个多余的“类”列,用单词定义每个类号,我终于通过删除该列使它工作了!问题已解决,再次感谢
    【解决方案2】:

    使用来自data.tabledcast

    library(data.table)
    dcast(setDT(df), code ~ class, value.var = c("Var1", "Var2"), sep=".")
       code Var1.A Var1.B Var1.C Var2.A Var2.B Var2.C
    1:   U1      1      6     87      3      3      7
    2:   U2      5      6      1     43     12      8
    

    【讨论】:

      【解决方案3】:

      带有reshape 的基本 R 选项可以帮助您

      reshape(
        df,
        direction = "wide",
        idvar = "code",
        timevar = "class"
      )`
      

      给了

        code Var1.A Var2.A Var1.B Var2.B Var1.C Var2.C
      1   U1      1      3      6      3     87      7
      2   U2      5     43      6     12      1      8
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-03
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 2022-10-15
        • 2021-12-30
        • 1970-01-01
        • 2020-11-30
        相关资源
        最近更新 更多