首先,我很抱歉,我知道我的问题与这里的其他几个问题重叠,但我对 R 确实很陌生,我找不到完全完成任务并且我实际上可以理解的答案。
我的数据集是这样的:
ID … Exam_t_minus_3 Exam_t_minus_2 Exam_t_minus_1 Grade_2012 Grade_2013 Grade_2014
1 Math Physics Chemestry 98 70 76
2 English French Russian 77 85 59
3 English Chemistry Biology 65 77 69
我希望它变成这样:
ID … i(as t_minus_i_) Exam Grade
1 3 Math 98
1 2 Physics 70
1 1 Chemistry 76
2 3 English 77
2 2 French 85
2 1 Russian 59
我已经完成了 swirl() 类(class),并认为我可以使用 tidyr 来完成它,但我不知道如何收集多于一组的列。我最终得到的结果如下:
ID … ................ Exam Grade
1 . Math 98
1 . Math 70
1 . Math 76
1 . Physics 98
1 . Physics 70
1 . Physics 76
我调查了这个:Gather multiple sets of columns还有其他一些人,但大多数人都在半路上迷失了我。
我也尝试了这个问题的答案(我事先将收入列更改为以 T_minus_* 结尾):Gather multiple columns with tidyr
即我尝试过
library(data.table)
res = melt(setDT(sample_df),
measure.vars = patterns("^Exam", "^Grade"),
variable.name = "i")
res[, i := factor(i, labels = c("3","2", "1"))]
它完成了我需要的大部分功能,但是,我需要将 i 列中的值设置为整数而不是分类变量,因为我需要它们用于将来的计算。
我尝试做res$i <- as.numeric(res$i)
,但这改变了顺序,即“3”被评估为 1,“1”被评估为 3。
我试图忽略它,但这给了我 1,2,3 以及 i 列值。
当我将收入列更改为 Earnings_T_minus_* 时,我是否可以以某种方式在 i 列中获取这些 * 值?
library(data.table)
res = melt(setDT(sample_df),
measure.vars = patterns("^Exam_T_minus_*", "^Grade_T_minus_*"),
variable.name = "i")
抱歉,这个问题有点长,也许令人困惑,但希望有人能引导我走向正确的方向。
最佳答案
您的data.table
方法几乎是正确的。使用多列 reshape 是可行的方法。
library(data.table)
melt(setDT(sample_df),
measure.vars = patterns("^Exam", "^Grade"), value.name = c("Exam", "Grade"),
variable.name = "i", variable.factor = FALSE)[
, i := 4L - as.integer(i)][order(ID)]
ID i Exam Grade 1: 1 3 Math 98 2: 1 2 Physics 70 3: 1 1 Chemistry 76 4: 2 3 English 77 5: 2 2 French 85 6: 2 1 Russian 59 7: 3 3 English 65 8: 3 2 Chemistry 77 9: 3 1 Biology 69
唯一的修改是将 variable.factor = FALSE
作为参数传递给 melt()
,在强制转换后对 i
进行一些算术运算为整数并适本地 order()
结果。
关于r - 收集/融合多个列集,变量列的整数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45354056/