我的目标是将某些列放到行中,其中列共享一个id,例如班级组中的学生。
请看这里:
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)
) 发布于 2021-08-23 22:18:37
使用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发布于 2021-08-23 21:03:00
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" https://stackoverflow.com/questions/68898847
复制相似问题