通过复制行合并r数据集列

通过复制行合并r数据集列,r,dataset,R,Dataset,我有一个7列的数据集。其中一列显示课程群集编号(1-9,可以有多个编号,如1,4,5,6),有3列(AH、SS、QS)根据群集编号具有逻辑值:如果1-3中有一个编号,则第1列为真,依此类推。结构如下: 'data.frame': 213 obs. of 7 variables: $ Major : chr "BUS" "BUS" "BUS" "BUS" ... $ CourseNumber:

我有一个7列的数据集。其中一列显示课程群集编号(1-9,可以有多个编号,如1,4,5,6),有3列(AH、SS、QS)根据群集编号具有逻辑值:如果1-3中有一个编号,则第1列为真,依此类推。结构如下:

'data.frame':   213 obs. of  7 variables:
 $ Major       : chr  "BUS" "BUS" "BUS" "BUS" ...
 $ CourseNumber: chr  "101" "105" "109" "110" ...
 $ Title       : chr  "Introduction to Business" "Foundations of Management" "Business Math" "Applied Statistics" ...
 $ Number      : chr  "4, 5" "5" "7, 8, 9" "7, 8, 9" ...
 $ AH          : logi  FALSE FALSE FALSE FALSE TRUE FALSE ...
 $ SS          : logi  TRUE TRUE FALSE FALSE TRUE TRUE ...
 $ QS          : logi  FALSE FALSE TRUE TRUE FALSE FALSE ...

我想将最后3列合并为1列,如下所示:例如,如果AH、SS、QS的值为T、T、F,则该行将复制为2,其中一行中的数据为AH,第二行中的数据为-SS。

您可以透视数据,以便列名(AH、SS、QS)显示在一列中,逻辑值显示在另一列中,然后在新的逻辑列中筛选该数据集中值为TRUE的行。这可以通过使用
tidyr
软件包中的
pivot\u longer
完成:

  library(tidyr)
  library(dplyr)  

  data %>%
    pivot_longer(cols = AH:QS, # columns that will be pivotted 
                 names_to = "Variable", # Column name of the 'variable' column
                 values_to = "LogVal") %>% # column name of the logical value column
    filter(LogVal) %>% # filter only rows that contain a TRUE
    select(-LogVal) # remove the logical column