2016-09-01 5 views
0

У меня есть список с кадрами несколько данных в нем:R извлечения значений из внутри фрейма данных в списке

weekday <- c("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") 
data1 <- c(letters[1:7]) 
data2 <- c(letters[8:14]) 

df1 <- data.frame(day = weekday, val = data1) 
df2 <- data.frame(day = weekday, val = data2) 

my_list <- list(list_1 = df1, list_2 = df2) 

Я пытаюсь выяснить, как вытащить данные, которые соответствуют определенный день в конкретный кадр данных. Я знаю, как извлечь кадр данных list_1,

> my_list[["list_1"]] 
    day val 
1 Sun a 
2 Mon b 
3 Tue c 
4 Wed d 
5 Thu e 
6 Fri f 
7 Sat g 

И как извлечь определенную строку, когда я знаю, индекс дня:

> my_list[["list_1"]][1,] 
    day val 
1 Sun a 

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

my_list[["list_1"]][list_1$day == "Sun",] 

, но я получаю сообщение об ошибке:

Error in `[.data.frame`(my_list[["list_1"]], list_1$day == "Sun",) : 
    object 'list_1' not found 

Я знаю, что я мог бы просто подмножество ФР к временной переменной, а затем это было бы легко, я «Я просто пытаюсь сделать это компактным и следовать хорошей практике.

ответ

1

Try my_list$list_1$day == "Sun". Ваш my_list по существу является вложенным списком (поскольку фрейм данных также является списком), так что вы можете связать оператор $, чтобы получить полный доступ к столбцам. Таким образом, ваш код может быть

my_list$list_1[my_list$list_1$day == "Sun", ] 

Как вы можете видеть, этот код непросто читать. По этой причине мне нравится with(). Это удобно здесь, так как список может быть принудительно применен к среде, и его намного легче читать.

with(my_list, list_1[list_1$day == "Sun", ]) 
+0

Если я хочу, чтобы затем извлечь 'val' из этой строки, как я могу сделать это внутри 'with()'? Я не могу просто добавить '[[" val "]]', он возвращается как 'NULL' –

+0

@JonathanH - Is' with (my_list, list_1 $ val) '(или' with (my_list, list_1 [["val "]])') что вы хотите? Это возвращает весь столбец 'val' как вектор. –

+0

P.S. - Вы можете проверить 'with()' используя такие вещи, как 'with (my_list, ls.str())' и 'with (my_list, ls())' –

2

Вы можете использовать subset или filter из dplyr, если вы хотите сэкономить, набрав:

subset(my_list[["list_1"]], day == "Sun") 
# day val 
# 1 Sun a 
+0

Я пытаюсь использовать '[', '[[' и '$' и избежать вызова 'filter' или' subset' –

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