У меня есть список фреймов данных int1
и int2
. Конечная цель этого кода — присвоить имена элементам в int1
и int2
. Остальная часть рабочего процесса для моей работы требует, чтобы я называл элементы списка несколько раз, и мне было интересно, как я могу создать функцию для уменьшения количества нажатий клавиш в строке, используя базовые функции r. Любые идеи?
library(lubridate)
library(tidyverse)
library(purrr)
date <- rep_len(seq(dmy("01-01-2011"), dmy("31-07-2011"), by = "days"), 200)
ID <- rep(c("A","B", "C"), 200)
df <- data.frame(date = date,
x = runif (length(date), min = 60000, max = 80000),
y = runif (length(date), min = 800000, max = 900000),
ID)
df$Month <- month(df$date)
# Create first list
int1 <- df %>%
# arrange(ID) %>% # skipped for readability of result
mutate(new = floor_date(date, '10 day')) %>%
mutate(new = if_else(day(new) == 31, new - days(10), new)) %>%
group_by(ID, new) %>%
filter(Month == "1") %>%
group_split()
# Create second list
int2 <- df %>%
# arrange(ID) %>% # skipped for readability of result
mutate(new = floor_date(date, '10 day')) %>%
mutate(new = if_else(day(new) == 31, new - days(10), new)) %>%
group_by(ID, new) %>%
filter(Month == "2") %>%
group_split()
# Expected Output
# Assign names to int1
names(int1) <- sapply(int1, function(x) paste(x$ID[1],
x$new[1], sep = "_"))
# Assign names to int2
names(int2) <- sapply(int2, function(x) paste(x$ID[1],
x$new[1], sep = "_"))
Использование group_split
не будет называть элементы list
. Это указано в ?group_split
it does not name the elements of the list based on the grouping as this typically loses information and is confusing.
Вместо этого используйте split
из base R
, который вернется с именами paste
ed, используя .
из столбцов «ID», «новые»
int1 <- df %>%
# arrange(ID) %>% # skipped for readability of result
mutate(new = floor_date(date, '10 day')) %>%
mutate(new = if_else(day(new) == 31, new - days(10), new)) %>%
group_by(ID, new) %>%
filter(Month == "1") %>% ungroup %>%
{split(., .[c('ID', 'new')])}
Аналогично для int2