Необходимо подмножество основного фрейма данных с использованием информации столбца в другом файле

#r

#r

Вопрос:

Пожалуйста, помогите, у меня есть основной набор данных, который я хочу подмножить по столбцам, и информация о столбцах в другом файле. В данном случае я хочу создать 3 фрейма данных из основного файла с требуемым столбцом в ColData (c(XX, CE.02), c(YY, CE.03, CE.01), c(ZZ, CE.05)).

 XX <- c(1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0)
YY <- c(0,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0)
ZZ <- c(1,0,1,1,0,0,0,1,0,1,0,0,1,0,1,1)
AL.01 <- c(NA,0,0,NA,NA,0,NA,0,0,3,0,0,0,3,0,0)
AL.02 <- c(NA,0,0,NA,NA,0,NA,0,0,4,0,0,0,2,0,0)
AL.03 <- c(NA,0,0,NA,NA,0,NA,0,0,3,0,0,0,3,0,0)
CE.01 <- c(NA,0,0,NA,NA,0,NA,0,0,3,0,0,0,3,0,0)
CE.02 <- c(NA,0,0,NA,NA,0,NA,0,0,3,0,0,0,2,0,0)
CE.03 <- c(NA,0,0,NA,NA,0,NA,0,0,3,0,0,0,2,0,0)
CE.04 <- c(NA,0,0,NA,NA,0,NA,0,0,3,0,0,0,1,0,0)
CE.05 <- c(NA,0,0,NA,NA,0,NA,0,0,3,0,0,0,1,0,0)

RCAQA <- c('XX','YY','ZZ')
QuestionID1 <- c('CE.02','CE.03','CE.05')
QuestionID2 <- c('','CE.01','')

MainData <- data.frame(XX,YY,ZZ,AL.01,AL.02,AL.03,CE.01,CE.02,CE.03,CE.04,CE.05)

ColData <- data.frame(RCAQA,QuestionID1,QuestionID2) 

  

MainData

MainData

ColData

ColData

Требуемый выходной фрейм данных 1 c(XX, CE.02)

RequiredOutputDataframe1

Требуемый выходной фрейм данных 2 c (YY, CE.03, CE.01)

Требуемыйoutputdataframe2

Требуемый выходной фрейм данных 3 c (ZZ, CE.05)

RequiredOutputDataframe3

Ответ №1:

Мы можем использовать asplit для разделения ColData по строкам и использовать lapply для выбора столбцов MainData . Мы используем intersect для получения общих столбцов. Это даст вам список фреймов данных.

 lapply(asplit(ColData, 1), function(x) MainData[intersect(names(MainData), x)]) 

#[[1]]
#   XX CE.02
#1   1    NA
#2   0     0
#3   0     0
#4   1    NA
#5   0    NA
#...

#[[2]]
#   YY CE.03 CE.01
#1   0    NA    NA
#2   1     0     0
#3   0     0     0
#4   1    NA    NA
#5   0    NA    NA
#6   0     0     0
#7   1    NA    NA
#...

#[[3]]
#   ZZ CE.05
31   1    NA
#2   0     0
#3   1     0
#4   1    NA
#5   0    NA
#6   0     0
#...
  

Используя dplyr , вы можете сделать это как :

 library(dplyr)
ColData %>%
  group_split(row_number(), .keep = FALSE) %>%
  purrr::map(~MainData %>% select(any_of(unlist(.x))))
  

Комментарии:

1. Спасибо за код, но почему-то я получаю сообщение об ошибке при запуске первого кода в моем наборе данных, второй выполняется правильно, но я также хочу, чтобы имя столбца было таким же, как в MainData, но я получаю имя столбца ColData. Мой фактический набор данных большой по сравнению с примером. Ошибка для первого кода. Ошибка в [.data.frame (File2, , x[!is.na (x)]) : выбраны неопределенные столбцы

2. @JK1185 Это означает, что есть определенные значения, в ColData которых отсутствуют MainData . Если 2-й метод работает для вас, почему бы не использовать это? Для первого метода попробуйте lapply(asplit(ColData, 1), function(x) MainData[intersect(names(MainData), x)])

3. Сообщение об ошибке — ошибка в [.data.frame(File2, , i[i != «»]]) : выбраны неопределенные столбцы

Ответ №2:

Вот как я бы поступил с df1, df2, df3:

 df1 <- MainData %>% select(one_of(as.character(as.vector(ColData[1]))))
df2 <- MainData %>% select(one_of(as.character(as.vector(ColData[2]))))
df3 <- MainData %>% select(one_of(as.character(as.vector(ColData[3])))) 
  

Комментарии:

1. Спасибо, но в вашем коде есть небольшое изменение. df1 <- MainData %>% select(one_of(как.character(как.vector(ColData[1,])))). Знаете ли вы, можно ли запустить это за 1 раз для всех 3 наборов данных вместо того, чтобы запускать его один за другим.

Ответ №3:

Базовое R решение

 dfs <- apply(ColData, 1L, function(i, df) df[, i[i != ""]], MainData)
df1 <- dfs[[1L]]
df2 <- dfs[[2L]]
df3 <- dfs[[3L]]
  

Комментарии:

1. Спасибо за код, но почему-то я получаю сообщение об ошибке при запуске моего набора данных с первым кодом, . Мой фактический набор данных большой по сравнению с примером. Ошибка для первого кода. Ошибка в [.data.frame (File2, , x[!is.na (x)]) : выбраны неопределенные столбцы

2. Извините, сообщение об ошибке Ошибка в [.data.frame (File2, , i[i != «»]]): выбраны неопределенные столбцы