R 将列名称转换为具有某种格式的行

问题描述 投票:0回答:1

我正在考虑将下面的原始表转换为其中包含主题名称的列本身成为名为主题的新列中的行。

原始数据:

身份证 年份 数学_子 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 库的方法,但它们产生的输出与我需要的完全相去甚远。

任何帮助将非常感激。

谢谢你。

r tidyverse
1个回答
0
投票

这是一个常见的转变。如果您对行和列的顺序不太挑剔,这些步骤可以生成相同的数据。

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)
)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.