У меня есть этот набор данных под названием "inputdata"
Country Unknown Male Female Affected Male Female Unaffected Male Female
USA 200 120 80 130 80 50 70 40 30
AU 140 80 60 60 30 30 80 50 30
И у меня будет два набора выходных данных, и они будут похожи на приведенные ниже, как вы можете видеть, входящий набор данных имеет здесь 3 категории, как указано в именах столбцов 2,5,8.
В выходном наборе данных 1 столбец Категория имеет категории, которые являются именами столбцов во входных данных. Тогда страна из столбца страны и столбец Мужской будет иметь значение из столбца Мужской во входных данных.
Точно так же в выходном наборе данных 2 Категория и Страна остаются такими же, но в 3-м столбце Фактические данные должны быть значения из соответствующих категорий во входных столбцах 2,5,8.
Ключевым моментом здесь является то, что структура входного набора данных остается прежней.
Output 1
Category Country Male
Unknown USA 120
Affected USA 80
Unaffected USA 40
.
.
.
Output 2
Category Country Actuals
Unknown USA 200
Affected USA 130
Unaffected USA 70
.
.
.
Итак, что я сделал сейчас, это использовал цикл for для подмножества каждой категории из входного набора данных с использованием индексов -
Например, при использовании inputdata[,c(1,i)]
и моей переменной 'i'
будут 3,6,9 for output 1
и 2,5,8 for output 2
. Затем создал список фреймов данных (по одному для каждой категории) и объединил их для каждого вывода. Мне просто интересно, есть ли другой способ сделать это эффективным.
РЕДАКТИРОВАТЬ: - Добавление моего кода по запросу,
for(i in seq(3, 9, by=3)) {
if(!exists('mylist')) mylist <- NULL
output1 <- inputdata[,c(1,i)]
if(i==3) {
output1$category <- 'unknown'
} else if (i==6) {
output1$category <- 'affected'
} else
output1$category <- 'unaffected'
mylist <- c(mylist,output1)
rm(output1)
}
for(i in seq(2, 8, by=3)) {
if(!exists('mylist')) mylist <- NULL
output2 <- inputdata[,c(1,i)]
if(i==3) {
output2$category <- 'unknown'
} else if (i==6) {
output2$category <- 'affected'
} else
output2$category <- 'unaffected'
mylist <- c(mylist,output2)
rm(output2)
}
Пожалуйста, дайте мне знать, если что-то неясно.