如何将多列组合成一个变量,将每一列附加到另一列的末尾并按 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()
的输入正确设置为 cols 和 values_to。 cols=...
定义您要从中获取值的列。 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
我有一个数据框,其中包含与同一变量相关的多个列,我想将它们合并到一个列中。但是,我可以在这里找到关于连接列(例如
为清楚起见,这里是我的输入数据的大致示例。
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()
的输入正确设置为 cols 和 values_to。 cols=...
定义您要从中获取值的列。 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