如何使用 R 将变量值转换为带下标的长格式数据集中的值?
How to convert variable value to value with subscripts in long form data set using R?
数据集以长格式排列,没有缺失值,有4列-第1列是“id”,第2列是“col”,第3列是二进制变量“ vol”,第四列是时间。
现在,我想将第 2 列“col”中“rec”的值按 id 转换为“rec1,rec2,rec3,...”。
例如,对于id=1和id=6的id,预期的数据集应该如下所示
id col vol time
1 rec1 1 1
1 rec2 1 2
1 rec3 0 3
2 rec1 1 1
2 rec2 1 2
2 rec3 1 3
3 rec1 0 1
3 rec2 0 2
3 rec3 0 3
4 rec1 1 1
4 rec2 0 2
4 rec3 0 3
5 rec1 1 1
5 rec2 0 2
6 rec1 1 1
6 rec2 1 2
6 rec3 0 3
6 rec4 0 4
原始数据集结构如下,
structure(list(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
5, 6, 6, 6, 6), col = c("rec", "rec", "rec", "rec", "rec", "rec",
"rec", "rec", "rec", "rec", "rec", "rec", "rec", "rec", "rec",
"rec", "rec", "rec"), vol = c(1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0,
0, 1, 0, 1, 1, 0, 0), time = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1,
2, 3, 1, 2, 1, 2, 3, 4)), row.names = c(NA, 18L), class = "data.frame")->df
使用paste
df$col <- with(df, paste0(col, time))
我们可以在 tidyverse 工作流程中使用 stringr
包中的 str_c
:
str_c
等同于 paste()
,区别在于 str_c()
默认没有分隔符。
library(dplyr)
library(stringr)
mutate(df, col = str_c(col, time))
id col vol time
1 1 rec1 1 1
2 1 rec2 1 2
3 1 rec3 0 3
4 2 rec1 1 1
5 2 rec2 1 2
6 2 rec3 1 3
7 3 rec1 0 1
8 3 rec2 0 2
9 3 rec3 0 3
10 4 rec1 1 1
11 4 rec2 0 2
12 4 rec3 0 3
13 5 rec1 1 1
14 5 rec2 0 2
15 6 rec1 1 1
16 6 rec2 1 2
17 6 rec3 0 3
18 6 rec4 0 4
数据集以长格式排列,没有缺失值,有4列-第1列是“id”,第2列是“col”,第3列是二进制变量“ vol”,第四列是时间。 现在,我想将第 2 列“col”中“rec”的值按 id 转换为“rec1,rec2,rec3,...”。
例如,对于id=1和id=6的id,预期的数据集应该如下所示
id col vol time
1 rec1 1 1
1 rec2 1 2
1 rec3 0 3
2 rec1 1 1
2 rec2 1 2
2 rec3 1 3
3 rec1 0 1
3 rec2 0 2
3 rec3 0 3
4 rec1 1 1
4 rec2 0 2
4 rec3 0 3
5 rec1 1 1
5 rec2 0 2
6 rec1 1 1
6 rec2 1 2
6 rec3 0 3
6 rec4 0 4
原始数据集结构如下,
structure(list(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
5, 6, 6, 6, 6), col = c("rec", "rec", "rec", "rec", "rec", "rec",
"rec", "rec", "rec", "rec", "rec", "rec", "rec", "rec", "rec",
"rec", "rec", "rec"), vol = c(1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0,
0, 1, 0, 1, 1, 0, 0), time = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1,
2, 3, 1, 2, 1, 2, 3, 4)), row.names = c(NA, 18L), class = "data.frame")->df
使用paste
df$col <- with(df, paste0(col, time))
我们可以在 tidyverse 工作流程中使用 stringr
包中的 str_c
:
str_c
等同于 paste()
,区别在于 str_c()
默认没有分隔符。
library(dplyr)
library(stringr)
mutate(df, col = str_c(col, time))
id col vol time
1 1 rec1 1 1
2 1 rec2 1 2
3 1 rec3 0 3
4 2 rec1 1 1
5 2 rec2 1 2
6 2 rec3 1 3
7 3 rec1 0 1
8 3 rec2 0 2
9 3 rec3 0 3
10 4 rec1 1 1
11 4 rec2 0 2
12 4 rec3 0 3
13 5 rec1 1 1
14 5 rec2 0 2
15 6 rec1 1 1
16 6 rec2 1 2
17 6 rec3 0 3
18 6 rec4 0 4