【问题标题】:How can I combine several columns into one variable, tacking each onto the end of the other and grouping by values in an ID variable?如何将多列合并为一个变量,将每一列附加到另一列的末尾并按 ID 变量中的值分组?
【发布时间】:2022-01-16 07:24:59
【问题描述】:

我有一个数据框,其中包含与同一变量相关的多列,我想将其合并为一列。但是,我可以在这里找到关于连接列的大多数答案(例如Merge 2 columns into one in dataframe),而我想在我的数据框中保留每个单独的数据单元格,但只需将它们组合成一列。

为清楚起见,这里是我的输入数据大致样子的示例。

a b c ID
string1 string11 string21 1111
string2 string12 string22 2222

这是我希望这些数据的样子:

newvar ID
string1 1111
string11 1111
string21 1111
string2 2222
string12 2222
string22 2222

到目前为止,我一直在尝试使用“pivot_longer()”来完成此操作,如下所示:

pivot_longer(df, c("a", "b", "c"), "newvar")

但我认为我必须误解 pivot_longer() 的目的,因为它返回的 df 单元格中填充了值 a b 和 c 而不是这些列中的行值。我也不确定 pivot_longer 是否能够像我希望的那样按列 ID 分组,除非可能通过管道。非常感谢任何帮助。

编辑:我意识到我使用 pivot_longer() 的问题似乎是我需要指定“values_to”作为参数“newvar”正在回答。

pivot_longer(df, c("a", "b", "c"), values_to = "newvar")

这段代码主要完成了我所需要的

【问题讨论】:

    标签: r dplyr data-wrangling


    【解决方案1】:

    尝试将函数pivot_longer()的输入正确设置为colsvalues_tocols=... 定义您从中获取值的列。 values_to = ... 定义列的新名称,您将在其中写入从 'cols' 获取的值。实际上我认为你做得很好,只是 pivot_longer 总是返回你从中获取值的列的名称,除非你尝试其他更棘手的事情。

    library(tidyverse)
    
    df = data.frame(
      a = c("string1","string2"),
      b= c("string11","string12"),
      c = c("string21", "string22"),
      ID = c("1111","2222")
    )
    
    df %>% 
      pivot_longer(cols = names(df)[1:3],
                        values_to = "newvar") %>% 
      select(newvar, ID)
    

    输出:

    # A tibble: 6 x 2
      newvar   ID   
      <chr>    <chr>
    1 string1  1111 
    2 string11 1111 
    3 string21 1111 
    4 string2  2222 
    5 string12 2222 
    6 string22 2222
    

    【讨论】:

      【解决方案2】:

      或者使用 data.table。

      library(data.table)
      
      df = data.table(a=c("string1", "string2"), b=c("string11", "string12"), c=c("string21", "string22"), ID=c(1111,2222))
      
      df_final = melt(df,
           id.vars="ID",
           measure.vars=c("a", "b", "c"),
           value.name="newvar")[order(by=ID)][, c("ID", "newvar")]
      

      输出:

      > df_final
           ID   newvar
      1: 1111  string1
      2: 1111 string11
      3: 1111 string21
      4: 2222  string2
      5: 2222 string12
      6: 2222 string22
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-08
        • 1970-01-01
        • 2016-04-04
        • 2021-02-15
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多