2015-12-15 2 views
2

У меня есть список списков, и я ищу подходящий метод для добавления нового списка в этот список на основе хронологического порядка. Вот пример:Как вставить элемент в середине неназванного списка на основе хронологических дат

my_list <- list(list("text" = list("headline" = "Hello, World!", 
            "text" = "This is some text"), 
            "start_date" = list("year" = 2015, 
                 "month" = "01", 
                 "day" = "01")), 
       list("text" = list("headline" = "Hola, Mundo!", 
            "text" = "Este es algo palabras"), 
            "start_date" = list("year" = 2015, 
                 "month" = "01", 
                 "day" = "03"))) 

Теперь, если я хочу, чтобы добавить новый элемент в этот список, где, скажем, start_date является 2015-01-02, я хочу, чтобы добавить его в середину списка при индексе 2 и нажмите 2-й элемент «вниз». Если start_date был в 2014-12-31, тогда я бы хотел его в самом начале и нажать все остальное «вниз», и если бы это было после 2015-01-03, я бы хотел его в конце. Есть ли более эффективный метод для этого, чем следующий?

new_list_item <- list("text" = list("headline" = "Bonjour le monde", "text" = "ceci est un texte"), "start_date" = list("year" = 2015, "month" = "01", "day" = "02")) 
counter <- 0 
index <- lapply(my_list, function(elem) { 
    date1 <- as.Date(paste(elem$start_date$year, elem$start_date$month, elem$start_date$day, sep = "-")) 
    date2 <- as.Date(paste(new_list_item$start_date$year, new_list_item$start_date$month, new_list_item$start_date$day, sep = "-")) 
    counter <<- counter + 1 
    if (date2 > date1) { 
    return(NULL) 
    } else { 
    return(counter) 
    } 
}) 
index <- min(unlist(index)[!is.null(index)]) 
my_list <- list(my_list[1:(index - 1)], new_list_item, my_list[index:length(my_list)]) 

Тем более, что описанный выше метод добавляет дополнительную индексацию элементов списка (т.е. [[1]][[1]]$text против [[1]]$text), которая не является идеальным. Любая помощь приветствуется.

+0

Вы считали использование названных элементов списка, а не индексов? Не уверен, что вы в конечном итоге планируете делать с этими данными, поэтому, возможно, это не сработает, но часто, когда у меня возникает проблема с добавлением или удалением элементов из списка или data.frame, которые испортили бы мои индексы , Я считаю, что кодирование по имени (более надежный и надежный способ кодирования в любом случае) часто решает мою проблему. – LauraS

ответ

2

Если вы определяете new_list_item, как это (чтобы соответствовать структуре my_list):

new_list_item <- list(list("text" = list("headline" = "Bonjour le monde", "text" = "ceci est un texte"), "start_date" = list("year" = 2015, "month" = "01", "day" = "02"))) 

то следующая функция работает:

insert_new_list_item <- function(old_list, new_item){ 
    # Get the date from new_item 
    new_item_date <- as.Date(paste(new_item[[1]]$start_date$year, 
          new_item[[1]]$start_date$month, 
          new_item[[1]]$start_date$day, sep = "-")) 

    # Get a vector of dates from old_list 
    dates_vector <- as.Date(vapply(old_list, function(x) paste(x$start_date$year, 
                 x$start_date$month, 
                 x$start_date$day, sep = "-"), 
          FUN.VALUE = character(1))) 

    # Append the date from the new list item and sort 
    dates_vector_new <- sort(c(dates_vector, new_item_date)) 

    # Get the position of the new list item date 
    new_position <- which(dates_vector_new == new_item_date) 

    # Append the new list item to the list 
    if(new_position == 1){ 
     new_list <- append(new_item, old_list) 
    } else { 
     new_list <- append(old_list, new_item, after = new_position-1) 
    } 

    new_list 
} 

insert_new_list_item(old_list = my_list, new_item = new_list_item) 

Этот вопрос также включает функцию на добавление: How to insert an element in the middle of a list?

+0

Вы заслуживаете медаль. Я попытался включить функцию append из связанного с вами вопроса, но не мог понять, как заставить его работать. Это очень приятное решение, так что спасибо! – brittenb

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