удалить элементы из списка списков из цикла for - PullRequest
4 голосов
/ 28 октября 2019

У меня есть именованный список списков (фреймов данных).

l_of_lists <- list(
  fruits = list(
      red = data.frame("apple", "cherry", "strawberry"),
      yellow = data.frame("banana", "lemon"),
      orange = data.frame("orange", "grapefruit", "blood orange")),
  colors = list(
      green = data.frame("light green", "green", "dark green"),
      red = data.frame("red", "dark red"),
      blue = data.frame("light blue", "blue", "dark blue")),
  places = list(
    inside = data.frame("living room", "bathrooom", "kitchen"),
    outside = data.frame("garden", "yard"),
    neighborhood = data.frame("playground", "shop", "school"))
  )

Я перебираю l_of_lists s sublists, чтобы определить количество столбцов каждого фрейма данных, и я хочу удалить каждое sublist, которое не удовлетворяет условию (которое в этом примере состоит из трех столбцов).

со следующим кодом:

for (ls in l_of_lists){
  for (sublist in ls){
    if (!ncol(sublist) == 3)
    {
      print(ncol(sublist))
      #sublist <- NULL # this does achieve the desired result
    }
  }
}

Как я могу удалить список, который я идентифицировал с условием? (Я уверен, что есть более эффективный способ сделать это, и я рад намекам на это.)

Ответы [ 2 ]

5 голосов
/ 28 октября 2019

Если вы хотите использовать циклы, то лучше использовать индексы, а не объекты:

for (i in 1:length(l_of_lists)){
  sublist = l_of_lists[[i]]
  for (j in 1:length(sublist)){
    obj = sublist[[j]]
    if (!ncol(obj) == 3)
    {
      print(ncol(obj))
      l_of_lists[[i]][[j]] <- NULL # this does achieve the desired result
    }
  }
}
5 голосов
/ 28 октября 2019

Гораздо проще называть вас элементами, у которых нет 3 столбцов:

lapply(l_of_lists,function(i)i[sapply(i,length)==3])

С помощью sapply вы перебираете каждый элемент l_of_list, чтобы получить вектор числа столбцов. Вы используете это для поднабора тех, которые имеют 3 столбца.

И если вы хотите удалить, попробуйте это

l_of_lists = lapply(l_of_lists,function(i)i[sapply(i,length)==3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...