我正在考虑将下面的原始表转换为其中包含主题名称的列本身成为名为主题的新列中的行。
原始数据:
身份证 | 年份 | 数学_子 | Eng_sub | Chem_sub |
---|---|---|---|---|
1 | 2010 | 20 | 15 | 12 |
1 | 2015 | 17 | 20 | 14 |
1 | 2016 | 13 | 17 | 12 |
3 | 2015 | 14 | 13 | 不适用 |
3 | 2016 | 12 | 12 | 不适用 |
5 | 2010 | 20 | 15 | 13 |
5 | 2015 | 17 | 20 | 14 |
5 | 2016 | 不适用 | 17 | 12 |
9 | 2015 | 14 | 13 | 不适用 |
9 | 2016 | 15 | 15 | 16 |
有更多随机 ID。
所需输出:
身份证 | 年份 | 数学_子 | Eng_sub | Chem_sub | 主题 |
---|---|---|---|---|---|
1 | 2010 | 20 | 不适用 | 不适用 | 数学 |
1 | 2010 | 不适用 | 15 | 不适用 | 英语 |
1 | 2010 | 不适用 | 不适用 | 12 | 化学 |
1 | 2015 | 17 | 不适用 | 不适用 | 数学 |
1 | 2015 | 不适用 | 20 | 不适用 | 英语 |
1 | 2015 | 不适用 | 不适用 | 14 | 化学 |
1 | 2016 | 13 | 不适用 | 不适用 | 数学 |
1 | 2016 | 不适用 | 17 | 不适用 | 英语 |
1 | 2016 | 不适用 | 不适用 | 12 | 化学 |
3 | 2015 | 14 | 不适用 | 不适用 | 数学 |
3 | 2015 | 不适用 | 13 | 不适用 | 英语 |
3 | 2015 | 不适用 | 不适用 | 不适用 | 化学 |
3 | 2016 | 12 | 不适用 | 不适用 | 数学 |
3 | 2016 | 不适用 | 12 | 不适用 | 英语 |
3 | 2016 | 不适用 | 不适用 | 不适用 | 化学 |
我尝试了很多使用 reshape 和 tidyr 库的方法,但它们产生的输出与我需要的完全相去甚远。
任何帮助将非常感激。
谢谢你。
这是一个常见的转变。如果您对行和列的顺序不太挑剔,这些步骤可以生成相同的数据。
library(dplry)
library(purrr)
subjects <- select(dd, ends_with("_sub")) %>% names()
map_df(subjects,
~select(dd, ID, Year, all_of(.x)) |> mutate(Subject=sub("_sub$","", .x)))
我们抓取所有主题列,循环遍历它们,仅提取匹配的列,并添加名称不带“_sub”的列。然后我们让
map_df
将所有子集重新放在一个帧中,并为我们添加 NA 值。
测试
dd <- data.frame(ID = c(1L, 1L, 1L, 3L, 3L, 5L, 5L, 5L, 9L, 9L),
Year = c(2010L, 2015L, 2016L, 2015L, 2016L, 2010L, 2015L, 2016L, 2015L, 2016L),
Math_sub = c(20L, 17L, 13L, 14L, 12L, 20L, 17L, NA, 14L, 15L),
Eng_sub = c(15L, 20L, 17L, 13L, 12L, 15L, 20L, 17L, 13L, 15L),
Chem_sub = c(12L, 14L, 12L, NA, NA, 13L, 14L, 12L, NA, 16L)
)