所以基本上我有一個我想要應用的資料框串列as.character()。為了獲得資料幀串列,我有一個檔案串列,我使用一個map()函式和一個我創建的讀取函式讀取了這些檔案。我不能使用map_df(),因為有些列作為不同的資料型別被讀入。所有檔案都是相同的,我知道如果需要,我可以在 read 函式中對資料型別進行硬編碼,但如果可以的話,我想避免這種情況。
此時,我將資料幀串列放入 for 回圈中并應用另一個map()函式來應用該as.character()函式。然后使用 . 壓縮這個最終的資料幀串列bind_rows()。
總而言之,這似乎是一個非常復雜的程序,請參見下面的代碼。
audits <- list.files()
my_reader <- function(x) {
my_file <- read_xlsx(x)
}
audits <- map(audits, my_reader)
for (i in 1:length(audits)) {
audits[[i]] <- map_df(audits[[i]], as.character)
}
audits <- bind_rows(audits)
有人對我如何改進這一點有任何想法嗎?理想情況下,我可以在單個矢量化map()函式中完成所有操作?
為了重現性,您可以使用兩個 iris 資料集,其中一個列資料型別已更改。
iris2 <- iris
iris2[1] <- as.character(iris2[1])
my_list <- list(iris, iris2)
uj5u.com熱心網友回復:
as.character適用于vectorwhiledata.frame是slist的a vector。across如果我們只想使用一次map
library(dplyr)
library(purrr)
map_dfr(my_list, ~ .x %>%
mutate(across(everything(), as.character)))
uj5u.com熱心網友回復:
我想展示一個基本的 R 解決方案,以防萬一它對其他人有幫助。您可以使用rapply遞回遍歷串列并應用函式。您可以指定類,如果要替換或取消列出/列出回傳的物件:
iris2 <- iris
iris2[1] <- as.character(iris2[1])
my_list <- list(iris, iris2)
mylist2 <- rapply(my_list, class = "ANY", f = as.character, how = "replace")
bigdf <- do.call(rbind, mylist2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446294.html
