【问题标题】:Remove specific columns from data frame从数据框中删除特定列
【发布时间】:2017-08-17 16:38:34
【问题描述】:

我正在尝试从数据框 (followed this) 中删除一组列,但我得到一个错误作为回报。

具体来说,数据框(NNF.data)的大小为 34233 行 147 列:

[118] "NNF.2015.03.EUR"      "NNF.2015.04.EUR"      "NNF.2015.05.EUR"     
[121] "NNF.2015.06.EUR"      "NNF.2015.07.EUR"      "NNF.2015.08.EUR"     
[124] "NNF.2015.09.EUR"      "NNF.2015.10.EUR"      "NNF.2015.11.EUR"     
[127] "NNF.2015.12.EUR"      "NNF.2016.01.EUR"      "NNF.2016.02.EUR"     
[130] "NNF.2016.03.EUR"      "NNF.2016.04.EUR"      "NNF.2016.05.EUR"     
[133] "NNF.2016.06.EUR"      "NNF.2016.07.EUR"      "NNF.2016.08.EUR"     
[136] "YTD.NNF.Year2005.EUR" "YTD.NNF.Year2006.EUR" "YTD.NNF.Year2007.EUR"
[139] "YTD.NNF.Year2008.EUR" "YTD.NNF.Year2009.EUR" "YTD.NNF.Year2010.EUR"
[142] "YTD.NNF.Year2011.EUR" "YTD.NNF.Year2012.EUR" "YTD.NNF.Year2013.EUR"
[145] "YTD.NNF.Year2014.EUR" "YTD.NNF.Year2015.EUR" "YTD.NNF.Year2016.EUR"

我想要做的是从 136-147 中删除列,或者删除名称中包含 YTD 的列。

我尝试使用

NNF.data[, grep("YTD", names(NNF.data)):= NULL]

但我得到了错误:

Error in `[.data.frame`(NNF.data, , `:=`(grep("YTD", names(NNF.data)),  : 
  could not find function ":="

同样,我试过了

NNF.data[, which(grepl("YTD", colnames(NNF.data))):=NULL]

但又一次,我明白了

Error in `[.data.frame`(NNF.data, , `:=`(which(grepl("YTD", colnames(NNF.data))),  : 
  could not find function ":="

有什么建议吗? 我确保 NNF.data 是一个数据框

> is.data.frame(NNF.data)
[1] TRUE

【问题讨论】:

  • := 适用于 data.table 对象。您是在使用data.frame 还是data.table
  • 我不知道 Carles,我正在使用 data.frame。数据框有什么等价物吗?
  • 如果有的话,你能发帖作为回答吗?谢谢
  • NNF.data[startsWith(names(NNF.data), "YTD")] <- list(NULL),但是data.table效率更高。

标签: r dataframe


【解决方案1】:

:= 仅适用于 data.table 对象。如果您正在使用data.frame,您可以试试这个:

df = data.frame(First = c(1,2,3), AVSecond = c(3,4,5), ThirdAV = c(6,7,8), Fourth = c(10,22,2))

df = df[-c(grep("AV", colnames(df)), 4)]

这将删除其中包含'AV' 的列和第四列。输出:

  First
1     1
2     2
3     3

【讨论】:

  • -grep(...) 很危险。考虑没有值匹配的情况。你会得到integer(0)
  • 如果没有匹配的值,它将只删除第四列。我不确定你是不是这个意思
  • 当然,但是当 4 不存在时,您将无法获得所有想要的列。
  • 例如,试试df[-grep("xxx", colnames(df))]。在这种不匹配的情况下,没有要删除的列。您希望返回整个数据集,但您什么也得不到。 !grepl(...) 更安全。或!startsWith(...),正如我在对该问题的评论中提到的那样。
【解决方案2】:
df = data.frame(YTD.NNF.Year2009.EUR=c(1,2,3),NNF.2016.06.EUR=c(3,4,5),HJK=c(6,7,8))
nm = colnames(df)  
numb = grepl("\\bYTD\\b", nm)
df = df[,-numb]

【讨论】:

  • -numb 可能不起作用,因为numb 是一个逻辑向量
  • numb 是一个逻辑 [1:3] TRUE FALSE FALSE
  • 没错。现在在上面做-。我认为您的意思是 ! 表示否定。
  • 所以删除 1 列(2 和 3 离开),即“YTD.NNF.Year2009.EUR”,它包含 YTD,所以应该删除。
猜你喜欢
  • 2018-04-13
  • 2011-10-30
  • 1970-01-01
  • 2019-11-04
  • 2017-12-12
  • 2012-01-04
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多