2013-10-09 2 views
1

Как было предложено где-то в Stackoverflow, чтобы хранить несколько ячеек данных, я помещаю их в список. Теперь, как я могу получить доступ к определенным столбцам - всем с тем же именем - всех данных в этом списке (чтобы найти максимум)?Как получить доступ к столбцам с одинаковыми именами всех фреймов данных в списке?

list[1:25]["colname"] 

NULL дает и

list[[1:25]]["colname"] 

дает "Error in list[[1:25]] : recursive indexing failed at level 3",

хотя я могу получить один столбец с

list[[1]]["colname"] 

Я также попытался c(), но не работает.

Я пробовал несколько поисков, но не нашел ничего подходящего. Я не программист, просто нужен для исследования. Я изучаю R (с Rstudio) «на лету» (я прочитал несколько уроков), поэтому может быть, что я просто не знаю правильных слов для поиска.

+2

Использование 'lapply' с \' [\ 'в качестве функции. – A5C1D2H2I1M1N2O1R2T1

+0

3 ответа и ни одного комментария ни к одному из них! Вы можете прочитать разделы [** about **] (http://stackoverflow.com/about) и [** FAQ **] (http://stackoverflow.com/faq) веб-сайта, чтобы помочь вам получить максимальную отдачу от SO. Если ответ действительно решает вашу проблему, вы можете * рассмотреть * выдержку и/или пометить ее как принятую, чтобы показать, что на вопрос был дан ответ, отметив небольшую зеленую галочку рядом с подходящим ответом. Вы ** не обязаны делать это, но это помогает уберечь сайт от оставшихся без ответа вопросов и вознаграждает тех, кто тратит время на решение вашей проблемы. –

+0

Приносим извинения перед ответчиками, я читал и часто задавал вопросы, и я знаю, что я должен продвигать и комментировать. У меня были некоторые проблемы с проверкой ответов с моими данными в то время, и через некоторое время я решил решить проблему вручную, после чего я полностью забыл вернуться сюда. Возможно, один из ответов могли бы решить мою проблему, но потому, что моя ситуация сделала проблему спорной, я не могу сказать, какой из них был бы один. Должен ли я выдвигать все ответы для попыток, или что такое правильный этикет здесь? – RandomMonitor

ответ

1

Если х ваш список и Sepal.Length это столбец, который вы хотите взять максимум по всем наборам данных в списке:

x <- rep(list(iris),25) 


max(unlist(lapply(x,function(df) max(df$Sepal.Length)))) 

Если вы хотите, максимальное значение для каждого набора данных в в списке:

lapply(x,function(df) max(df$Sepal.Length)) 
+0

Это именно то, что мне нужно, спасибо! Что делает функция (df), правда? Похоже, что помощь не работает. – RandomMonitor

+0

...Кажется, создается (?) Своеобразное временное имя для фрейма данных, которое можно использовать для ссылки на столбцы, но что это за черт, как это работает? – RandomMonitor

+0

Прочтите '? Lapply'. Функция применяется к каждому элементу списка. Интуитивно вы могли видеть это как цикл, где для каждого цикла «df» заменяется элементом списка. – JT85

1

Вот один из возможных способов использования sapply, а также [[.

data <- list(data.frame(a = 1:3, b = 4:6), 
      data.frame(a = 10:15, b = 40:45)) 

sapply(data, "[[", "b") 
[[1]] 
[1] 4 5 6 

[[2]] 
[1] 40 41 42 43 44 45 
+0

Это дало мне доступ к правильным столбцам в dataframes, поэтому спасибо за это, но ответ JT85 решил мою следующую проблему: как получить максимум от них. – RandomMonitor

0

Одна из функций семьи apply будет делать трюк. Использование анонимной функции в этом случае работать на каждом data.frame в списке, чтобы найти значение первого столбца max ...

# Make some reproducible data 
set.seed(1) 
ll <- replicate(3 , as.data.frame(matrix(sample(9) , 3)) , simplify = FALSE) 
#[[1]] 
# V1 V2 V3 
#1 1 4 3 
#2 9 8 5 
#3 7 2 6 

#[[2]] 
# V1 V2 V3 
#1 4 8 5 
#2 7 2 3 
#3 6 9 1 

#[[3]] 
# V1 V2 V3 
#1 6 4 2 
#2 3 9 5 
#3 1 7 8 

# Get max value of each of the first columns - could use a quoted column name here 
lapply(ll , function(x) max(x[ , 1 ])) 
#[[1]] 
#[1] 9 

#[[2]] 
#[1] 7 

#[[3]] 
#[1] 6 
+0

Кажется, по сути, это то же самое, что и ответ JT85, однако указанное имя столбца не работает, но дает «Ошибка в' [.data.frame' (x, «colname»): undefined columns selected ». Почему функция $ -rection в работе JT85, как и имя [, 1], но цитируемое имя столбца? Я полностью не понимаю, как R использует различные методы ссылок и их различия. – RandomMonitor

+0

@ RandomMonitor Ну, мы выложили в то же время и этот ответ отличался тонко, пока он не был отредактирован, который был * после того, как * я опубликовал свой ответ (который, я думаю, является чистым в любом случае). Вы, должно быть, неправильно написали свое имя столбца ?! например попробуйте 'lapply (ll, function (x) max (x ['V1']))' из моего примера. Работает отлично? –

+0

(Это была не критика, просто наблюдение.) Он работает с вашим примером, но не с моими данными. Может быть, потому, что в одном из данных в списке нет столбца, который есть у всех остальных? Если да, то почему работает функция $ -reference? Он дает предупреждение «In max (df $ colname): отсутствие непустых аргументов до max, возврат -Inf», но только предупреждение, а не ошибка, поэтому он все еще делает то, что я просил. – RandomMonitor

Смежные вопросы