【问题标题】:Delete a column in a data frame within a list删除列表中数据框中的列
【发布时间】:2012-09-21 18:43:21
【问题描述】:

我根据 A 列中的因子水平从我的数据框中制作了一个列表。在列表中,我想删除该列。我的头在说 lapply,但没有别的:P

$A
ID Test
A   1
A   1

$B
 ID Test
 B   1
 B   3
 B   5

进入这个

$A
Test
 1
 1

$B
Test
 1
 3
 5

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    假设您的列表名为myList,这样的事情应该可以工作:

    lapply(myList, function(x) { x["ID"] <- NULL; x })
    

    更新

    对于更通用的解决方案,您还可以使用以下内容:

    # Sample data
    myList <- list(A = data.frame(ID = c("A", "A"), 
                                  Test = c(1, 1), 
                                  Value = 1:2), 
                   B = data.frame(ID = c("B", "B", "B"), 
                                  Test = c(1, 3, 5), 
                                  Value = 1:3))
    # Keep just the "ID" and "Value" columns
    lapply(myList, function(x) x[(names(x) %in% c("ID", "Value"))])
    # Drop the "ID" and "Value" columns
    lapply(myList, function(x) x[!(names(x) %in% c("ID", "Value"))])
    

    【讨论】:

    • 谢谢 :) 我想我开始了解如何在 lapply 中应用函数了.. :)
    • @EndreGrünerOfstad,没问题。请参阅我更新的答案以了解您可以使用的另一个选项。
    • @mrwab 谢谢!顺便说一句,你知道如何合并两个具有相同元素结构的列表吗?例如。一个从两个列表(每个元素级别包含一个向量)到一个列表(每个元素级别包含两个向量)。也许这本身就应该是一个问题..
    • @SoilSciGuy,改用x[length(x)] &lt;- NULL 之类的东西?
    • @vagabond,只是为了允许我在同一行中写两个语句。如果您没有; x,则实际上不会返回任何内容....
    【解决方案2】:

    如果您是tidyverse 用户,则有一个替代解决方案,它利用purrr 包中的map 函数。

    # Create same sample data as above
    myList <- list(A = data.frame(ID = c("A", "A"), 
                                  Test = c(1, 1), 
                                  Value = 1:2), 
                   B = data.frame(ID = c("B", "B", "B"), 
                                  Test = c(1, 3, 5), 
                                  Value = 1:3))
    # Remove column by name in each element of the list
    map(myList, ~ (.x %>% select(-ID)))
    

    【讨论】:

      【解决方案3】:

      如果您有一个不包含 ID 列的数据框,您可以使用 map_if 仅在它存在的地方将其删除。

      myList <- list(A = data.frame(ID = c("A", "A"), 
                                Test = c(1, 1), 
                                Value = 1:2), 
                 B = data.frame(ID = c("B", "B", "B"), 
                                Test = c(1, 3, 5), 
                                Value = 1:3),
                 C = data.frame(Test = c(1, 3, 5), 
                                Value = 1:3))
      map_if(myList, ~ "ID" %in% names(.x), ~ .x %>% select(-ID), .depth = 2)
      

      【讨论】:

        【解决方案4】:

        我们可以在这里高效地使用括号函数"["

        示例

        L <- replicate(3, iris[1:3, 1:4], simplify=FALSE)  # example list
        

        按数字删除列

        lapply(L, "[", -c(2, 3))
        

        按名称删除列

        lapply(L, "[", -grep(c("Sepal.Width|Petal.Length"), names(L[[1]])))
        

        结果

        # [[1]]
        #   Sepal.Length Petal.Width
        # 1          5.1         0.2
        # 2          4.9         0.2
        # 3          4.7         0.2
        # 
        # [[2]]
        #   Sepal.Length Petal.Width
        # 1          5.1         0.2
        # 2          4.9         0.2
        # 3          4.7         0.2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-06-07
          • 2021-09-29
          • 2021-01-07
          • 2012-11-13
          • 1970-01-01
          • 2021-11-06
          • 2017-09-29
          • 2019-09-08
          相关资源
          最近更新 更多