Перебрать именованный список dfs, проверить условие в столбце df, если true, вернуть имя элемента списка

У меня есть именованный список объектов data.frame (training_data). Каждый объект data.frame будет проверен на основе столбца «x», и если тест пройден, предполагается, что будет возвращено имя этого объекта data.frame.

В приведенном ниже случае должны быть возвращены "a" и "b":

df <- data.frame(x=1:10, y=1:10)
df1 <- data.frame(x=11:20, y=11:20)
training_data <- list(df, df, df1, df1)
names(training_data) <- c("a", "b", "c", "d")

pos <- lapply(training_data, function(data) {
                                 if(data$x==1)
                                    ["return the name of the data.frame object in hand"]
                              })

Мой вопрос заключается в том, как именно можно определить имя объекта, который в настоящее время обрабатывается в любой итерации lapply, и как вернуть это имя, чтобы оно попало в список «pos».

С уважением


person Shahzad    schedule 01.02.2013    source источник
comment
пожалуйста, dput несколько примеров данных. если вы не понимаете, прочитайте это. ... я никогда не видел if внутри функции lapply, вы уверены, что вам не нужна ifelse (которая векторизована)?   -  person Anthony Damico    schedule 01.02.2013


Ответы (1)


Здесь нет необходимости использовать lapply, вы можете получить доступ к своему списку, например:

training_data[['pos']] 

Это даст вам доступ к data.frame с именем 'pos' или posxx...

ИЗМЕНИТЬ после уточнения OP

Я использую lapply в названиях списка, я и я использую один и тот же режим доступа выше к основному списку

pos <- lapply(names(training_data), function(data) {
  if(training_data[[data]]$x==1)        ## here your condition is not correct
    data

})

  [[1]]
[1] "a"

[[2]]
[1] "b"

[[3]]
NULL

[[4]]
NULL

Вы можете удалить элементы NULL, используя что-то вроде

unlist(pos)
[1] "a" "b"

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

person agstudy    schedule 01.02.2013
comment
training_data — это список, содержащий несколько объектов data.frame. Условие должно быть помещено в поле метки, содержащееся внутри объекта data.frame. - person Shahzad; 01.02.2013
comment
Нет. Вы спрашивали, как определить имя обрабатываемого в данный момент объекта... Теперь поле метки содержится внутри объекта data.frame? что вы имеете в виду? имя столбца? - person agstudy; 01.02.2013
comment
Нет. Не имя столбца. Каждый элемент (в данном случае объект dataframe) списка имеет имя. Я хочу определить имя этого data.frame, если выполняется следующее условие: if(x$label==pos), затем верните имя этого объекта data.frame. - person Shahzad; 01.02.2013
comment
Или, другими словами, я хочу определить все те объекты data.frame, где столбец метки содержит значение pos. - person Shahzad; 01.02.2013
comment
@Shahzad Я думаю, вам действительно нужно привести воспроизводимый пример с ожидаемым результатом. - person agstudy; 01.02.2013
comment
Я отредактировал вопрос сейчас. Надеюсь, теперь это будет иметь какой-то смысл. Спасибо. - person Shahzad; 01.02.2013
comment
@Shahzad, мы хотим помочь вам, но вы нам не платите - вы обязаны предоставить четко определенные исходные данные, а также желаемые результаты. пожалуйста, внимательно прочитайте это :) - person Anthony Damico; 01.02.2013
comment
@ЭнтониДамико. Готово, сэр. Теперь я отредактировал вопрос. Спасибо. - person Shahzad; 01.02.2013