如何将多列组合成一个变量,将每一列附加到另一列的末尾并按 ID 变量中的值分组?

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?

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

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

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() 的目的,因为它 returns 的 df 的单元格中填充了值 a b 和 c,而不是这些列中的行值。我也不确定 pivot_longer 是否能够像我希望的那样 group_by 列 ID,除了可能通过管道。非常感谢任何帮助。

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

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

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

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

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

或 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