【问题标题】:Remove Same Column from Multiple Dataframes in R从 R 中的多个数据框中删除相同的列
【发布时间】:2020-09-28 03:10:44
【问题描述】:

我正在尝试使用以下代码从 R 中的多个数据帧“df1”和“df2”中删除同一列“col3”,但我不知道如何将 lapply 函数的结果重新分配给数据帧。我错过了什么?任何帮助将不胜感激。

df1 <- data.frame(col1 = c(1:4), col2 = c("A","B","C","D"), col3 = c("H","I","J","K"))
df2 <- data.frame(col1 = c(11:14), col2 = c("L","M","N","O"), col3 = c("W","X","Y","Z"))
list_dfs <- list(df1,df2)

lapply(list_dfs, function(x) x[!(names(x) %in% c("col3"))])

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    我们可以使用select 和map

    library(purrr)
    library(dplyr)
    list_dfs2 <- map(list_dfs, ~ .x %>%
                                    select(-col3))
    

    或者没有匿名函数

    list_dfs2 <- map(list_dfs, dplyr::select, -col3)
    

    或者lapply和subset

    list_dfs2 <- lapply(list_dfs, subset, select = -col3)
    list_dfs2
    #[[1]]
    #  col1 col2
    #1    1    A
    #2    2    B
    #3    3    C
    #4    4    D
    
    #[[2]]
    #  col1 col2
    #1   11    L
    #2   12    M
    #3   13    N
    #4   14    O
    

    最好将数据集保存在list 中,不要在全局环境中创建多个数据集


    我们可以mget创建命名list并使用list2env更新原始数据集

    list2env(lapply(mget(paste0('df', 1:2)), subset, select = -col3), .GlobalEnv)
    

    或者另一个简单的选项是 assign 和 for 循环

    for(df in paste0('df', 1:2)) assign(df, subset(get(df), select = -col3))
    df1
    #  col1 col2
    #1    1    A
    #2    2    B
    #3    3    C
    #4    4    D
    
    df2
    #  col1 col2
    #1   11    L
    #2   12    M
    #3   13    N
    #4   14    O
    

    【讨论】:

      【解决方案2】:

      您删除列的代码很好 - 您需要分配结果。 list_dfs &lt;- lapply(...)。在 R 中,几乎总是,如果您不使用 &lt;- 或 = 进行赋值,则不会发生任何变化。

      【讨论】:

        【解决方案3】:

        如果要将子集化结果分配回原始数据帧,请使用以下方法创建命名列表:

        list_dfs <- list(df1 = df1,df2 = df2)
        #OR
        #list_dfs <- dplyr::lst(df1, df2)
        

        执行子集操作

        list_dfs <- lapply(list_dfs, function(x) x[names(x) != "col3"])
        

        使用list2env将结果分配回原始数据帧

        list2env(list_dfs, .GlobalEnv)
        

        【讨论】:

          猜你喜欢
          • 2023-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-13
          • 1970-01-01
          • 2016-04-09
          相关资源
          最近更新 更多