![](/img/trans.png)
[英]How can I maintain the list of names of the tibbles when using sapply function in R?
[英]How can I iteratively create multiple tibbles using a function in R (tidyverse)?
我必須用相同的變量創建 10 個小標題(數據只是不同),這導致我復制以下代碼
dpd <- list_sheets[[1]] %>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d"))) %>%
select(-DATEMODIFI) %>%
filter(year == 2019),
fuse <- list_sheets[[2]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d"))) %>%
select(-DATEMODIFI) %>%
filter(year == 2019),
ohprimary <- list_sheets[[3]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d"))) %>%
select(-DATEMODIFI) %>%
filter(year == 2019),
ohsecondary <- list_sheets[[4]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d"))) %>%
select(-DATEMODIFI) %>%
filter(year == 2019),
poles <- list_sheets[[5]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d"))) %>%
select(-DATEMODIFI) %>%
filter(year == 2019),
pv <- list_sheets[[6]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d"))) %>%
select(-DATEMODIFI) %>%
filter(year == 2019),
switch <- list_sheets[[7]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d")))%>%
select(-DATEMODIFI) %>%
filter(year == 2019),
transformers <- list_sheets[[8]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d")))%>%
select(-DATEMODIFI) %>%
filter(year == 2019),
ugprimary <- list_sheets[[9]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d")))%>%
select(-DATEMODIFI) %>%
filter(year == 2019),
ugsecondary <- list_sheets[[10]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d")))%>%
select(-DATEMODIFI) %>%
filter(year == 2019)
所以我創建了以下函數,並嘗試像這樣迭代地創建它們:
createTibble <- function(i){
list_sheets[[i]]%>%
filter(LASTUSER %in% users ) %>%
mutate(year = as.numeric(format(DATEMODIFI, format = "%Y")),
month = as.numeric(format(DATEMODIFI, format = "%m")),
day = as.numeric(format(DATEMODIFI, format = "%d")))%>%
select(-DATEMODIFI) %>%
filter(year == 2019)
}
features <- c('dpd', 'fuse')
for (feature in seq_along(features)){
tibble <- sym(features[feature]) # returns the proper symbol e.g. 'dpd' -> dpd
tibble <- createTibble(feature) # This just gives me a table called tibble
}
這不會給我兩個 tibble(dpd 和保險絲),而是我只會得到一個名為 tibble 的 tibble
我究竟做錯了什么? 我喜歡 R 但為什么做這樣的事情一定很煩人
編輯:
features <- c('dpd', 'fuse')
output <- vector('list', length(features))
for (feature in seq_along(features)){
output[[feature]] <- createTibble(feature)
name <- sym(features[feature])
print(name)
name <- output[[feature]]
}
為了創建一個對象list
,用一個空list
初始化並根據for
循環每次迭代中函數的輸出為其賦值
features <- c('dpd', 'fuse')
output <- setNames(vector('list', length(features)), features)
for (feature in seq_along(features)){
output[[feature]] <- createTibble(feature)
}
不建議在全局環境中有多個對象,但如果需要,則assign
一個選項
for (feature in seq_along(features)){
assign(features[feature], value = createTibble(feature))
}
現在,我們檢查
ls()
對於創建的對象
或者使用tidyverse
library(purrr)
map(seq_along(features), ~createTibble(.x)) %>%
set_names(features) %>%
list2env(.GlobalEnv)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.