R代码:列到行,即分组到个人
R code: columns to rows i.e group to individual persons
我的目标是将某些列变成行,其中列共享一个 id,例如 class 组中的学生。
请看这里:
Group Student1 Age1 Grade1 Student2 Age2 Grade2
1 1 Sarah 17 A John 16 B
2 2 Tom 15 B Harry 16 C
3 3 Mary 15 C Jack 18 A
我想要这个数据,这样每一行都是一个学生而不是上面的组:
Group Student Age Grade
1 1 Sarah 17 A
2 1 John 16 B
3 2 Tom 15 B
4 2 Harry 16 C
5 3 Mary 15 C
6 3 Jack 18 A
我试过使用
newData <- melt(dat, id.vars = c("id"))
但这给了我一个 id 列表和所有其他值作为一列。有没有函数可以得到上面的结果?
数据:
dat <- structure(
list(
Group = 1:3,
Student1 = c("Sarah", "Tom", "Mary"),
Age1 = c(17L, 15L, 15L),
Grade1 = c("A", "B", "C"),
Student2 = c("John", "Harry", "Jack"),
Age2 = c(16L, 16L, 18L),
Grade2 = c("B", "C", "A")
),
class = "data.frame",
row.names = c(NA,-3L)
)
reshape(df, 2:ncol(df), idvar = 'Group', sep='', dir = 'long')
Group time Student Age Grade
1.1 1 1 Sarah 17 A
2.1 2 1 Tom 15 B
3.1 3 1 Mary 15 C
1.2 1 2 John 16 B
2.2 2 2 Harry 16 C
3.2 3 2 Jack 18 A
tidyr::pivot_longer(df, -Group, names_pattern ='(\D+)', names_to = '.value')
# A tibble: 6 x 4
Group Student Age Grade
<int> <chr> <int> <chr>
1 1 " Sarah" 17 " A"
2 1 " John" 16 " B"
3 2 " Tom" 15 " B"
4 2 " Harry" 16 " C"
5 3 " Mary" 15 " C"
6 3 " Jack" 18 " A"
使用data.table
library(data.table)
melt(setDT(dat), id.var = 'Group',
measure = patterns("Student", "Age", "Grade"),
value.name = c("Student", "Age", "Grade"))[, variable := NULL][]
Group Student Age Grade
1: 1 Sarah 17 A
2: 2 Tom 15 B
3: 3 Mary 15 C
4: 1 John 16 B
5: 2 Harry 16 C
6: 3 Jack 18 A
我的目标是将某些列变成行,其中列共享一个 id,例如 class 组中的学生。
请看这里:
Group Student1 Age1 Grade1 Student2 Age2 Grade2
1 1 Sarah 17 A John 16 B
2 2 Tom 15 B Harry 16 C
3 3 Mary 15 C Jack 18 A
我想要这个数据,这样每一行都是一个学生而不是上面的组:
Group Student Age Grade
1 1 Sarah 17 A
2 1 John 16 B
3 2 Tom 15 B
4 2 Harry 16 C
5 3 Mary 15 C
6 3 Jack 18 A
我试过使用
newData <- melt(dat, id.vars = c("id"))
但这给了我一个 id 列表和所有其他值作为一列。有没有函数可以得到上面的结果?
数据:
dat <- structure(
list(
Group = 1:3,
Student1 = c("Sarah", "Tom", "Mary"),
Age1 = c(17L, 15L, 15L),
Grade1 = c("A", "B", "C"),
Student2 = c("John", "Harry", "Jack"),
Age2 = c(16L, 16L, 18L),
Grade2 = c("B", "C", "A")
),
class = "data.frame",
row.names = c(NA,-3L)
)
reshape(df, 2:ncol(df), idvar = 'Group', sep='', dir = 'long')
Group time Student Age Grade
1.1 1 1 Sarah 17 A
2.1 2 1 Tom 15 B
3.1 3 1 Mary 15 C
1.2 1 2 John 16 B
2.2 2 2 Harry 16 C
3.2 3 2 Jack 18 A
tidyr::pivot_longer(df, -Group, names_pattern ='(\D+)', names_to = '.value')
# A tibble: 6 x 4
Group Student Age Grade
<int> <chr> <int> <chr>
1 1 " Sarah" 17 " A"
2 1 " John" 16 " B"
3 2 " Tom" 15 " B"
4 2 " Harry" 16 " C"
5 3 " Mary" 15 " C"
6 3 " Jack" 18 " A"
使用data.table
library(data.table)
melt(setDT(dat), id.var = 'Group',
measure = patterns("Student", "Age", "Grade"),
value.name = c("Student", "Age", "Grade"))[, variable := NULL][]
Group Student Age Grade
1: 1 Sarah 17 A
2: 2 Tom 15 B
3: 3 Mary 15 C
4: 1 John 16 B
5: 2 Harry 16 C
6: 3 Jack 18 A