for循环更改具有指定唯一长度的列以考虑多个数据帧

for loop to change columns with a specified unique length to factor in multiple dataframes

我有几个数据框,我需要先修复多个列的 类,然后才能继续。因为数据帧都有相同的变量,但 类 似乎从一个数据帧到另一个数据帧不同,我想我会去一个“for 循环”并指定一个列应该被编码为因素的唯一长度或数字。

我尝试了以下因素:

dataframes <- list(dataframe1, dataframe2, dataframe2, dataframe3)

for (i in dataframes){

cols.to.factor <-sapply(i, function(col) length(unique(col)) < 6)

i[cols.to.factor] <- apply(i[cols.to.factor] , factor)
}

现在代码运行了,但它没有改变任何东西。我错过了什么? 提前感谢您的帮助!

说明

for(i in dataframes)

从列表 dataframes 中提取 i 并且循环更改副本,永远不会重新分配给原始副本。解决问题的方法是

for (i in seq_along(dataframes)){
  x <- dataframes[[i]]
  cols.to.factor <-sapply(x, function(col) length(unique(col)) < 6)
  x[cols.to.factor] <- lapply(x[cols.to.factor] , factor)
  dataframes[[i]] <- x
}

基于 lapply 的等效解决方案是

dataframes <- lapply(dataframes, \(x){
  cols.to.factor <- sapply(x, function(col) length(unique(col)) < 6)
  x[cols.to.factor] <- lapply(x[cols.to.factor], factor)
  x
})
library(tidyverse)
# example data
list(
  iris,
  iris %>% mutate(Sepal.Length = Sepal.Length %>% as.character())
) %>%
  # unify column classes
  map(~ .x %>% mutate(across(everything(), as.character))) %>%
  # optional joining if wished
  bind_rows() %>%
  mutate(Species = Species %>% as.factor()) %>%
  as_tibble()
#> # A tibble: 300 x 5
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>    <chr>        <chr>       <chr>        <chr>       <fct>  
#>  1 5.1          3.5         1.4          0.2         setosa 
#>  2 4.9          3           1.4          0.2         setosa 
#>  3 4.7          3.2         1.3          0.2         setosa 
#>  4 4.6          3.1         1.5          0.2         setosa 
#>  5 5            3.6         1.4          0.2         setosa 
#>  6 5.4          3.9         1.7          0.4         setosa 
#>  7 4.6          3.4         1.4          0.3         setosa 
#>  8 5            3.4         1.5          0.2         setosa 
#>  9 4.4          2.9         1.4          0.2         setosa 
#> 10 4.9          3.1         1.5          0.1         setosa 
#> # … with 290 more rows

reprex package (v2.0.1)

于 2021-10-05 创建