【问题标题】:Mutating several columns of many dataframes with For loop or Apply使用 For 循环或 Apply 改变许多数据帧的几列
【发布时间】:2022-12-03 12:29:20
【问题描述】:

我正在尝试对下一个问题使用循环或应用系列解决方案。我的数据框很少,例如:

df1 <- data.frame(a = c(1,2,3,NA,NA,NA,NA,NA,9,NA),b = c(1,2,3,4,NA,NA,NA,8,9,10),c = c(1,2,3,NA,NA,NA,7,8,NA,NA))

df2 <- data.frame(a = c(1,2,3,4,5,6,NA,NA,NA,10),b = c(1,2,3,4,NA,NA,NA,8,9,10),c = c(1,2,3,NA,NA,NA,7,8,NA,NA))

df5 <- data.frame(a = c(1,2,3,4,5,6,NA,NA,9,10),b = c(1,2,3,4,5,6,NA,8,9,10),c = c(1,2,3,NA,NA,NA,7,8,9,NA)) 

我在这里尝试使用 na.approx 来填补一些 NA 空白。我的想法是:

l <- c(1,2,5)
for (i in l){
    df[[i]] <- df[[i]] %>% mutate(a = na.approx(a, na.rm = FALSE))
    df[[i]] <- df[[i]] %>% mutate(b = na.approx(b, na.rm = FALSE))
    df[[i]] <- df[[i]] %>% mutate(c = na.approx(c, na.rm = FALSE))
}

在此示例中,我收到以下错误:

Error in UseMethod("mutate") : 
no applicable method for 'mutate' applied to an object of class "c('double', 'numeric')"

根据我的实际数据,我得到了这个错误:

Error in `vectbl_as_col_location2()`:
! Can't extract columns past the end.
i Location 13101 doesn't exist.
i There are only 16 columns.

其中“13101”将是名为“df13101”的数据框的一部分。

当我检查数据框类时,我得到

[1] "data.frame" 

例如,但我得到的实际数据框

[1] "grouped_df" "tbl_df"     "tbl"        "data.frame"

当我检查每个变量的类型时,我想改变的都是数字(示例和真实变量)。

我需要了解如何正确调用这些数据帧,以及由于数据类或 mutate 的使用而可能面临的问题。我试过使用 mapply,但我对 R 很陌生,而且我几乎不了解整个 apply 系列。

任何帮助都会很棒,感谢阅读!

【问题讨论】:

    标签: r for-loop apply mapply


    【解决方案1】:

    如果数据帧存储在列表中,这样做会更容易。然后,您可以将该函数应用于每个数字列。

    library(dplyr)
    library(zoo)
    
    l <- c(1,2,5)
    list_of_data <- mget(paste0('df', l))
    
    list_of_data <- purrr::map(list_of_data, ~.x %>%
                          mutate(across(where(is.numeric), 
                           ~na.approx(.x, na.rm = FALSE))))
    
    list_of_data
    #$df1
    #    a  b  c
    #1   1  1  1
    #2   2  2  2
    #3   3  3  3
    #4   4  4  4
    #5   5  5  5
    #6   6  6  6
    #7   7  7  7
    #8   8  8  8
    #9   9  9 NA
    #10 NA 10 NA
    
    #$df2
    #    a  b  c
    #1   1  1  1
    #2   2  2  2
    #3   3  3  3
    #4   4  4  4
    #...
    #...
    

    如果您希望新值再次反映在实际数据框中,请使用list2env

    list2env(list_of_data, .GlobalEnv)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多