HAVE = data.frame("STUDENT"=c(1, 2, 3),
"CLASS"=c('A', 'B', 'C'),
"SCORE1"=c(50, 79, 61),
"SCORE2"=c(74, 100, 70),
"SCORE3"=c(78, 65, 87),
"TEST1"=c(80, 96, 93),
"TEST2"=c(59, 57, 89),
"TEST3"=c(63, 53, 92))


WANT = data.frame("STUDENT"=c(1, 1, 1, 2, 2, 2, 3, 3, 3),
"CLASS"=c('A','A','A','B','B','B','C','C','C'),
"SEMESTER"=c(1, 2, 3, 1, 2, 3, 1, 2, 3),
"SCORE"=c(50, 74, 78, 79, 100, 65, 61, 70, 87),
"TEST"=c(80, 59, 63, 96, 57, 53, 93, 89, 92))

审判-

WANT = tidyr::pivot_longer(HAVE, cols = -c("STUDENT", "CLASS"), names_to = c('SEMESTER', '.value'),
names_prefix = c("SCORE", "TEST"))

推荐答案

我们需要names_sepnames_pattern来查找列名中的分隔符.在这里,列名应该在非数字(\\D)和数字(\\d)之间分割——我们使用regex lookaround(或者使用names_pattern = "^(\\D+)(\\d+)$")来捕获字符)

library(tidyr)
pivot_longer(HAVE, cols = -c(STUDENT, CLASS),
    names_to = c(".value", "SEMESTER"), names_sep = "(?<=\\D)(?=\\d)")

-输出

# A tibble: 9 × 5
  STUDENT CLASS SEMESTER SCORE  TEST
    <dbl> <chr> <chr>    <dbl> <dbl>
1       1 A     1           50    80
2       1 A     2           74    59
3       1 A     3           78    63
4       2 B     1           79    96
5       2 B     2          100    57
6       2 B     3           65    53
7       3 C     1           61    93
8       3 C     2           70    89
9       3 C     3           87    92

R相关问答推荐

如何计算具有NA的行的更改百分比

如何使用R以NASAGIBS.ViirsEarthAtNight2012风格绘制自定义 map

仅返回R中所有其他列的列ID和年份缺失(NA)数据的列表

以R表示的gglikert地块调整总数

在R中使用自定义函数时如何删除该函数的一部分?

根据固定值范围在tible中添加新行

检测(并替换)字符串中的数学符号

单击 map 后,将坐标复制到剪贴板

以R中的正确顺序将日期时间字符列转换为posixct

如何计算R数据集中每个女性的子元素数量?

在for循环中转换rabrame

在连续尺度上转置标签[瀑布图,R]

多个过滤器内的一个盒子在仪表板Quarto

使用列/行匹配将两个不同维度的矩阵相加

在R中使用Scale_y_Break后更改y轴标签

ComplexHEAT:使用COLUMN_SPLIT时忽略COLUMN_ORDER

`夹心::vcovCL`不等于`AER::tobit`标准错误

R -使用矩阵reshape 列表

如何在PDF格式的kableExtra表格中显示管道字符?

在r中整理图例和堆叠图的问题