Какова хорошая стратегия в R для хранения результатов в форме списка для последующего доступа к ним по именам, а не по индексам? - PullRequest
9 голосов
/ 08 марта 2011

Я хотел бы автоматизировать процесс создания результатов, когда я применяю определенные методы моделирования.Поэтому у меня будут разные параметры, которые будут применяться (например, расстояния иерархической кластеризации и методы связи).Результаты будут иметь матричную форму, чтобы я мог получить доступ к отдельным результатам, указав параметры модели (например, единичный, евклидовый).В кадре данных я мог бы назвать столбцы и строки и получить доступ к элементам просто с помощью df[rname[1],cname[1]].Насколько я понимаю, невозможно использовать объекты фрейма данных для хранения результатов списка.Поэтому мне нужны списки для хранения списков-результатов.Но в списках я могу указать только lst$cname[1], а не оба измерения.Я прав?

# data frame layout for numeric results does not work with list results
rname<-c("u","v","w")
cname<-c("ave","single")

# dataframe for results but does not work for results which are lists
paste.1<-function(x,y) paste(x,y,sep=".")
df1<-data.frame(lapply(cname,paste.1,x=rname),row.names=rname)
colnames(df1)<-cname

# creating list for results - do not get a good idea to proceed from here Advices??
lst<-(lapply(cname,paste.1,x=rname))
names(lst)<-cname

# results example - could be anything else 
# with a dataframe I could use df1[rname,cname]<-foo(rname,cname)
# with lists I guess its not as easy
require(graphics)
ave.u <- hclust(dist(USArrests,"euclidean"), cname[1])
ave.v <- hclust(dist(USArrests,"maximum"), cname[1])
ave.w <- hclust(dist(USArrests,"manhattan"), cname[1])
single.u <- hclust(dist(USArrests,"euclidean"), cname[2])
single.v <- hclust(dist(USArrests,"maximum"), cname[2])
single.w <- hclust(dist(USArrests,"manhattan"), cname[2])

Ну, я не уверен, что существует решение, которое, я думаю, должно существовать.В конце я просто хочу получить доступ к результатам списка через имена строк и столбцов.Я знаю, что могу перевести имена строк / столбцов в числовые, а затем поиграть с назначением правильных индексов, чтобы найти свои результаты в списке длины (rname) x длины (cname), но так как фрейм данных очень удобно использоватьЯ предполагаю, что это должен быть простой способ хранить его более удобным для пользователя.Может также случиться, что я не очень хорошо разбираюсь в концепции списков, так как я только начинаю играть с R. Поэтому мой вопрос: какова была бы хорошая стратегия для хранения структурированных результатов (которые являются списками)?используя R?

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

Вы можете использовать оператор $ несколько раз, например:

mname <-c("euclidean","maximum","manhattan")
lst <- sapply(mname,function(x) sapply(cname,function(y) hclust(dist(USArrests,x),y),simplify=F),simplify=F)
names(lst)<-rname

И вы можете использовать следующее для справки,

lst$"u"$"ave"

Call:
hclust(d = dist(USArrests, x), method = y)

Cluster method   : average 
Distance         : euclidean 
Number of objects: 50 

К сожалению, lst$rname[1]$cname[1] неработать, но вы можете использовать do.call:

do.call(`$`,list(do.call(`$`,list(lst,rname[1])),cname[1]))

Call:
hclust(d = dist(USArrests, x), method = y)

Cluster method   : average 
Distance         : euclidean 
Number of objects: 50 

Редактировать

Существует более простая версия, но она изнашивает ваши квадратные скобки!

lst[[rname[1]]][cname[1]]
$ave

Call:
hclust(d = dist(USArrests, x), method = y)

Cluster method   : average 
Distance         : euclidean 
Number of objects: 50 

Редактировать 2

Вышеупомянутая запись в квадратных скобках, кажется, оборачивает объект в list, что означает, что он не возвращает объект должным образом, но ХэдлиПредложение в комментариях яснее и позволяет избежать этой проблемы:

lst[[c(rname[1],cname[1])]]
3 голосов
/ 08 марта 2011

Можно иметь матрицу списков:

nr <- length(rname)
nc <- length(cname)

m <- matrix(list(), nr, nc, dimnames = list(rname, cname))

m[["u", "ave"]] <- ave.u

# etc.

Например, сформируйте имена строк rnm и имена столбцов cnm и фрейм данных g всех комбинаций их значений. Затем создайте матрицу списков, m:

rnm <- c("euclidean", "maximum", "manhattan")
cnm <- c("ave", "single")
g <- expand.grid(rnm, cnm)
f <- function(i) hclust(dist(USArrests, g[i,1]), g[i,2])
m <- matrix(lapply(1:nrow(g), f), length(rnm), dimnames = list(rnm, cnm))

Мы можем получить доступ к таким элементам:

> m[["euclidean", "single"]]

Call:
hclust(d = dist(USArrests, g[i, 1]), method = g[i, 2])

Cluster method   : single 
Distance         : euclidean 
Number of objects: 50
1 голос
/ 18 апреля 2018

Кадры данных представляют собой типичные списки, но в «прямоугольном» формате.Каждая запись в списке может содержать список.Таким образом, идея, которую вы, возможно, пожелаете рассмотреть, будет "вложенными таблицами".Вложенная таблица содержит столбец, содержащий «основной» отличительный признак / категорию, а второй столбец содержит соответствующие данные.Я привожу пример, показывающий создание вложенной таблицы, и некоторые вещи, которые вы можете использовать для манипулирования / извлечения вещей.

    library(dplyr)
    library(tidyr)
    #mock_data creation
    samples <- c("Class A", "Class A", "Class B", "Class B")
    ht.in <- c(65, 66, 72, 75)
    wt.lb <- c(150, 160, 180, 210)
    BMI <- c(22, 24, 23, 26)
    data <- cbind.data.frame(samples, ht.in, wt.lb)
    View(data)
    #nesting data
    data_n <- data %>% group_by(samples) %>% nest() #%>% is a piping function. Takes the output from the left and pipes it into the function on the right. 
    #nested retrieval
    unnest(data_n)
    #Basic summary
    data_sum <- data %>% group_by(samples) %>% 
    summarise(mean.ht = mean(ht.in), 
      mean.lb = mean(wt.lb), mean.BMI = mean(BMI))
    #Combining summary with nested format 
    data_n_sum <- left_join(data_n, data_sum, by = "samples")
    #Extracting information via filtering and unnest()
    filter(data_n_sum, mean.ht < 70) %>%  #we filter our data_n_sum where the mean height is less than 70.
      select(samples, data) %>% #unnest only likes two columns, so we keep the two columns, one which has the nested info, and the other which contains the 'categorical' variable that belongs to the samples... 
        unnest()
    #Extracting information through $ and [[]]
    data_n_sum$data[[1]]$ht.in #You can loop through these numerical indices (lapply)

Мне это очень нравится, так как они обеспечивают структуру, но достаточно гибки для извлечения соответствующих данных и еще много чего.Дополнительное чтение: https://blog.rstudio.com/2016/02/02/tidyr-0-4-0/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...