Концентрирование строк в цикле for

#r #for-loop #tidyverse #stringr

#r #for-цикл #аккуратная вселенная #stringr

Вопрос:

Я сталкиваюсь с проблемой, когда пытаюсь объединить строку в списке фреймов данных. Конечная цель — выполнить итерацию по ряду вложенных списков (список> список> фрейм данных) и применить функцию, которая концентрирует определенный столбец и заменяет значение в столбце фрейма данных.

 library(purrr)
library(tibble)
library(dplyr)
library(tidyverse)
library(stringr)

Time <- c("20060126000000","20060129000000","20050629000000")
Colvalue2 <- c(5,4,8)
Colvalue1 <- c(22,765,12)

time_list <- list(Time,Colvalue2,Colvalue1)
time_listdf <- as.data.frame(time_list, col.names = c("Time","Colvalue2","Colvalue1"))

# The time is formatted so that the first 1 - 4 Values are the year e.g "2006", the second 5 - 6 are month e.g "01", 
# and the third part from 7 - 8 is the date e.g "26". The final values are the seconds etc (not relevant to this example)

for (i in time_listdf$Time){
  
  year_str <- str_sub(i, 1,4)
  month_string <- str_sub(i, 5,6)
  date_str <- str_sub(i, 7,8)
  final_str <- str_c(date_str, month_string, year_str, sep = '/')
  
}

 

Фрейм данных будет выглядеть следующим образом для каждого первого столбца фрейма данных из вложенных списков.

 
# Example date value = 26/01/2006

Time_new <- c("26/01/2006","29/01/2006","29/06/2005")
Colvalue2 <- c(5,4,8)
Colvalue1 <- c(22,765,12)

new_df <- as.data.frame(list(Time_new,Colvalue1,Colvalue2))

 

Ответ №1:

Было бы лучше, если бы вы заменили Time столбец фактической датой, с которой вы можете это сделать as.Date .

 time_listdf$Time <- as.Date(time_listdf$Time, '%Y%m%d')
time_listdf

#        Time Colvalue2 Colvalue1
#1 2006-01-26         5        22
#2 2006-01-29         4       765
#3 2005-06-29         8        12
 

Если вы хотите отображать даты в определенном формате, вы можете использовать format .


Чтобы применить это для использования lapply списка фреймов данных, если ваш список вызывается list_df , вы можете сделать :

 list_df <- lapply(list_df, function(x) 
                  transform(x, Time = as.Date(Time, '%Y%m%d')))
 

Ответ №2:

Мы можем использовать tidyverse

 library(dplyr)
library(purrr)
library(lubridate)
df <- df %>%
      mutate(Time = ymd(Time))
 

В списке наборов данных

 list_df <- map(list_df, ~ .x %>%
                             mutate(Time = ymd(Time))