Как назначить кадры данных указанным c местоположениям в списке в R - PullRequest
0 голосов
/ 22 апреля 2020

Я создал 15 отдельных фреймов данных через a для l oop, каждый из которых представляет баллы для каждого из элементов опроса, включающие 15 различных масштабов / областей c. Они называются от df1 до df15 в соответствии с исходным порядком моих областей topi c, но я бы хотел поместить их в один список на основе другого порядка сортировки. У меня есть отдельный фрейм данных с именем topi c .area, в котором перечислены все 15 областей topi c, их первоначальный порядок, и он упорядочен в новом порядке сортировки:

Topi c. Область ...... orig.order ... sort.order
Лидерство ........ 3 ................ 1
Взаимодействие ..... 1 ............... 2
Инновации ......... 2 .............. ..3
et c ...

По сути, я хочу сделать следующее, но код не работает для меня. Я очень плохо знаком с R, поэтому я ценю любые решения, которые не слишком продвинуты, поэтому я понимаю логику c позади них.

myList<- list()

for(m in 1:15) {
 myList[[m]]<- paste("df", topic.area$orig.order[m], sep = "") 
}

Я думаю, проблема в том, что вы не можете использовать вставить функцию в команду присваивания, но я не знаю, как обойти это.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Вот полностью воспроизводимый пример, основанный на данных Pokémon Stats . Вместо того, чтобы просто записывать входные файлы в list(), я использую assign() для имитации набора фреймов данных в глобальной среде.

download.file("https://raw.githubusercontent.com/lgreski/pokemonData/master/pokemonData.zip",
              "pokemonData.zip",
              method="curl",mode="wb")
unzip("pokemonData.zip")

thePokemonFiles <- list.files("./pokemonData",
                              full.names=TRUE)
filenames <- substr(list.files("./pokemonData",full.names = FALSE),1,5) 
results <- lapply(1:length(thePokemonFiles),function(x) {
     # read data and assign to a name in global environment 
     data <- read.csv(thePokemonFiles[x],stringsAsFactor = FALSE)
     assign(filenames[x],data,globalenv())
     return(TRUE)
})

На данный момент у нас есть 7 фреймов данных с именами от gen01 до gen07 в глобальной среде.

enter image description here

Далее мы генерируем желаемый порядок сортировки как вектор. Мы будем использовать это вместе с именами из вектора filenames, чтобы получить данные и построить список вывода в желаемом порядке сортировки фреймов данных.

desiredSortOrder <- c(1,3,5,7,2,4,6)
sortedDataFrames <- lapply(desiredSortOrder,function(x){
     get(filenames[x])
})
# verify generation numbers by printing first row of each data frame 
lapply(sortedDataFrames,function(x){
     x[1,c(1,2,12)]
})

Поскольку столбец Generation в каждом фрейме данных соответствует связанному имени файла, мы можем проверить порядок сортировки, напечатав первую строку каждого фрейма данных.

>lapply(sortedDataFrames,function(x){
+      x[1,c(1,2,12)]
+ })
[[1]]
  Number      Name Generation
1      1 Bulbasaur          1

[[2]]
  Number    Name Generation
1    252 Treecko          3

[[3]]
  Number    Name Generation
1    494 Victini          5

[[4]]
  Number   Name Generation
1    722 Rowlet          7

[[5]]
  Number      Name Generation
1    152 Chikorita          2

[[6]]
  Number    Name Generation
1    387 Turtwig          4

[[7]]
  Number    Name Generation
1    650 Chespin          6

> 
0 голосов
/ 22 апреля 2020

Получить все данные в списке. Как вы упомянули, это уже заказано orig.order.

list_df <- mget(paste0('df', 1:15))

Вы можете расположить их на основе sort.order напрямую, выполнив:

sorted_list_df <- list_df[topic.area$sort.order]
...