【问题标题】:how to remove multiple columns in r dataframe?如何删除r数据框中的多列?
【发布时间】:2016-04-09 15:26:51
【问题描述】:

我正在尝试删除数据框中的某些列。 我想知道为什么它适用于单列但不适用于多列 例如 这行得通

album2[,5]<- NULL

这不起作用

album2[,c(5:7)]<- NULL
Error in `[<-.data.frame`(`*tmp*`, , 5:7, value = NULL) : 
replacement has 0 items, need 600

这也行不通

for (i in 5: (length(album2)-1)){
 album2[,i]<- NULL
}
Error in `[<-.data.frame`(`*tmp*`, , i, value = NULL) : 
new columns would leave holes after existing columns

【问题讨论】:

  • 试试album2[,5:7]&lt;- list(NULL)
  • 如果您能提供一个最小的可重现示例来解决您的问题,那就太好了。我们可以从中工作并使用它来向您展示如何回答您的问题。这样,将来其他人也可以适合您的问题以及随附的答案。您可以查看this SO post,了解如何在 R 中制作一个出色的可重现示例。
  • @EricFail 尤其是据我所知,第一个示例“例如,这行得通”实际上不起作用。
  • @doctorG 使用 "list(NULL)" 使其适用于多列,使用 NULL 和单列工作。我将在未来负责重现性。

标签: r dataframe subset


【解决方案1】:

基本子集:

album2 <- album2[, -5] #delete column 5
album2 <- album2[, -c(5:7)] # delete columns 5 through 7

【讨论】:

  • 不推荐按位置删除列,至少对我来说是这样。
  • 是的,也不是。 OP 是在指定列位置的背景下提出的。如果您知道所需的位置,那么这很好。为了让其他人知道您的评论是否对他们有用/相关,您能补充一下为什么不推荐它吗?
  • 好吧,如果一个人在他/她的数据中添加一个新列然后列位置改变了怎么办?我同意你的回答是正确的,但它既不安全也不高效。
  • 隐含的意思是你知道你想要什么列号。达到这一点取决于你。考虑您是以交互方式还是以编程方式进行操作(以及因此需要应对哪些条件)也取决于您。
【解决方案2】:

添加答案,因为这是搜索“drop multiple columns in r”时的热门搜索:

单列移除的通用版本,例如df$column1 &lt;- NULL,是使用list(NULL)

df[ ,c('column1', 'column2')] &lt;- list(NULL)

这也适用于位置索引:

df[ ,c(1,2)] &lt;- list(NULL)

这是一个更普遍的下降,正如一些 cmets 所提到的,不建议按索引删除。加上熟悉的负子集(在其他答案中使用)不适用于作为字符串给出的列:

> iris[ ,-c("Species")]
Error in -"Species" : invalid argument to unary operator

【讨论】:

  • 你能解释一下为什么list(NULL)而不仅仅是NULL吗?
【解决方案3】:

如果您只想删除第 5 列和第 7 列而不是第 6 列,请尝试:

album2 <- album2[,-c(5,7)] #deletes columns 5 and 7

【讨论】:

    【解决方案4】:

    这对我有用。

    x <-dplyr::select(dataset_df, -c('column1', 'column2'))
    

    【讨论】:

      【解决方案5】:

      @Ahmed Elmahy 以下方法应该可以帮助您,当您有一个要从数据框中删除的列名向量时:

      test_df <- data.frame(col1 = c("a", "b", "c", "d", "e"), col2 = seq(1, 5), col3 = rep(3, 5))
      rm_col <- c("col2")
      test_df[, !(colnames(test_df) %in% rm_col), drop = FALSE]
      

      一切顺利,探索者

      【讨论】:

      • drop 在这种情况下做什么?
      【解决方案6】:

      以下行将从数据框“数据”中删除 col_1 和 col_2

      data[!(colnames(data) %in% c('col_1','col_2'))]
      

      【讨论】:

        【解决方案7】:

        这是我前几天在@JoachimSchork 的博客Statistics Globe 中读到的一个有趣的解决方案。您可以按列名删除列。您可以了解更多here

        library(data.table)
        
        mtcars2 <- mtcars
        
        setDT(mtcars2)[, c("mpg", "cyl", "disp", "hp") := NULL]
        
        > head(mtcars2)
           drat    wt  qsec vs am gear carb
        1: 3.90 2.620 16.46  0  1    4    4
        2: 3.90 2.875 17.02  0  1    4    4
        3: 3.85 2.320 18.61  1  1    4    1
        4: 3.08 3.215 19.44  1  0    3    1
        5: 3.15 3.440 17.02  0  0    3    2
        6: 2.76 3.460 20.22  1  0    3    1
        
        

        【讨论】:

          【解决方案8】:

          另一个类似于@Dulakshi Soysa 的解决方案是使用列名,然后分配一个范围。

          例如,如果我们的数据框df() 的列名定义为column_1column_2column_3 直到column_15。我们有兴趣删除第 5 到第 10 列。

          我们可以使用列名来指定范围,例如,

          library(dplyr)
          x = select(df, -c('column_5':'column_10'))
          

          在删除多个相邻列时,指定范围可以节省一些时间。如果您想使用一些相邻和一些不相邻的列,也可以使用它。例如,如果要删除除先前指定的列之外的第 1 列,则将代码更新如下:

          library(dplyr)
          x = select(df, -c('column_1', 'column_5':'column_10'))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-28
            • 2022-09-22
            相关资源
            最近更新 更多