r - 收集/融合多个列集,变量列的整数值?

标签 r tidyr melt

首先,我很抱歉,我知道我的问题与这里的其他几个问题重叠,但我对 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/

相关文章:

r - 如何将简单的文本表达式转换为 R 中的数学表达式

c - .C() 返回一个空列表

r - pivot_longer 并返回 NA

r - dplyr 重铸 - 未找到变量

r - 使用 dplyr 计算融化数据上某个值的出现次数

在 data.table 中 reshape

r - 在 R 中,使用 melt 和 cast reshape "mixed"数据框

r - 标记绘图区域外的线尾

r - 如何忽略R中连续的起始零

Rivot_longer() 输出中有 NA