首先,我很抱歉,我知道我的问题与其他几个问题重叠,但我对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
我已经完成了漩涡()课程,并认为我可以用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。
我试图把它留下来,但是对于i列值,这给了我1,2,3。
当我将收入列更改为Earnings_T_minus_ *时,我可能会以某种方式在i列中获取这些*值吗?
library(data.table)
res = melt(setDT(sample_df),
measure.vars = patterns("^Exam_T_minus_*", "^Grade_T_minus_*"),
variable.name = "i")
对不起,这个问题变得有点长,也许令人困惑,但希望有人能引导我朝着正确的方向前进。
答案 0 :(得分:1)
使用dplyr
和tidyr
的解决方案。
它需要两次gather
进程。我们第一次可以收集i(as t_minus_i_)
和Exam
。第二次,我们可以收集Year
和Grade
。
starts_with
是一个辅助函数,可以选择带有字符串开头的列。 sub
是用空字符串“”替换字符串以进一步格式化列。 as.integer
是将字符数转换为整数。 dt2
是最终输出。
library(dplyr)
library(tidyr)
dt2 <- dt %>%
# First gather process: gather the i(as t_minus_i_) and Exam
gather(`i(as t_minus_i_)`, Exam, starts_with("Exam")) %>%
mutate(`i(as t_minus_i_)` = as.integer(sub("Exam_t_minus_", "", `i(as t_minus_i_)`))) %>%
# Second gather process: gather the Grade
gather(Year, Grade, starts_with("Grade")) %>%
mutate(Year = as.integer(sub("Grade_", "", Year))) %>%
arrange(ID)
dt2
# ID i(as t_minus_i_) Exam Year Grade
# 1 1 3 Math 2012 98
# 2 1 2 Physics 2012 98
# 3 1 1 Chemestry 2012 98
# 4 1 3 Math 2013 70
# 5 1 2 Physics 2013 70
# 6 1 1 Chemestry 2013 70
# 7 1 3 Math 2014 76
# 8 1 2 Physics 2014 76
# 9 1 1 Chemestry 2014 76
# 10 2 3 English 2012 77
# 11 2 2 French 2012 77
# 12 2 1 Russian 2012 77
# 13 2 3 English 2013 85
# 14 2 2 French 2013 85
# 15 2 1 Russian 2013 85
# 16 2 3 English 2014 59
# 17 2 2 French 2014 59
# 18 2 1 Russian 2014 59
# 19 3 3 English 2012 65
# 20 3 2 Chemistry 2012 65
# 21 3 1 Biology 2012 65
# 22 3 3 English 2013 77
# 23 3 2 Chemistry 2013 77
# 24 3 1 Biology 2013 77
# 25 3 3 English 2014 69
# 26 3 2 Chemistry 2014 69
# 27 3 1 Biology 2014 69
数据强>
dt <- read.table(text = "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",
header = TRUE, stringsAsFactors = FALSE)