#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
ColData
Требуемый выходной фрейм данных 1 c(XX, CE.02)
Требуемый выходной фрейм данных 2 c (YY, CE.03, CE.01)
Требуемый выходной фрейм данных 3 c (ZZ, CE.05)
Ответ №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 != «»]]): выбраны неопределенные столбцы