【问题标题】:How to remove column(s) if a row contains a value?如果一行包含一个值,如何删除列?
【发布时间】:2021-11-12 09:50:58
【问题描述】:

我看过很多关于如果用户指定的列包含某个字符串时如何删除行的帖子。

我想做相反的事情并概括它。如果该列中的任何行包含某个字符串,我想删除每一列。 (为了与 Excel 进行比较,我会找到包含给定字符串的所有单元格,然后删除每一列。)

我该怎么做?我在考虑dplyrfilter,但我必须指定我认为的列,或者至少我知道如何处理它的方式。但我有 300 多列和近 4000 行。

编辑:这是我的数据框的示例。

# A tibble: 6 x 310
  ISIN      AU000KFWHAC9 AU3CB0243657  AU3CB0256162 AU3CB0260321 AU3CB0265239 AU3CB0283190 AU3SG0001928 AU3SG0002371
  <chr>     <chr>        <chr>         <chr>        <chr>        <chr>        <chr>        <chr>        <chr>       
1 Timestamp MID_PRICE    Mid Price Cl~ Mid Price C~ Mid Price C~ Mid Price C~ Mid Price C~ Mid Price C~ Mid Price C~
2 41275     Invalid RIC. NA            NA           Invalid RIC. NA           Invalid RIC. NA           NA          
3 41276     NA           NA            NA           NA           NA           NA           NA           NA          
4 41277     NA           NA            NA           NA           3            NA           NA           NA          
5 41278     NA           NA            NA           NA           NA           NA           NA           NA          
6 41279     5            NA            4            NA           NA           NA           NA           NA  

如您所见,数据框充满了许多 NA。我不确定这是否会影响某些功能的能力。

【问题讨论】:

标签: r dplyr


【解决方案1】:

数据框为:

> df <- data.frame(a=c("a", "b", "c"), b=c("bad string", "d", "e"), c=c("f", "g", "h"))
> df
  a          b c
1 a bad string f
2 b          d g
3 c          e h
> 

使用colSums:

> df[, !colSums(df == "bad string")]
  a c
1 a f
2 b g
3 c h
> 

仅保留colSums0 的列。

【讨论】:

  • 谢谢。我试过这个,但是我得到了错误:Error: Can't use NA as column index with [ at positions 2, 3, 4, 5, 6, and 304 more.我现在在我的帖子中添加了示例数据,所以你可以在我的数据中看到很多 NA,我觉得这个功能在这种情况下不能很好地工作。作为参考,我使用了以下matched_green &lt;- matched_green[, !colSums(matched_green == "Invalid RIC.")]
【解决方案2】:

您可以grep您的搜索:

dat[,-grep("Invalid", dat)]

       ISIN AU3CB0243657 AU3CB0256162 AU3CB0265239 AU3SG0001928 AU3SG0002371
1 Timestamp   MidPriceC~   MidPriceC~   MidPriceC~   MidPriceC~   MidPriceC~
2     41275         <NA>         <NA>         <NA>         <NA>         <NA>
3     41276         <NA>         <NA>         <NA>         <NA>         <NA>
4     41277         <NA>         <NA>            3         <NA>         <NA>
5     41278         <NA>         <NA>         <NA>         <NA>         <NA>
6     41279         <NA>            4         <NA>         <NA>         <NA>

数据

dat <- structure(list(ISIN = c("Timestamp", "41275", "41276", "41277", 
"41278", "41279"), AU000KFWHAC9 = c("MID_PRICE", "Invalid_RIC.", 
NA, NA, NA, "5"), AU3CB0243657 = c("MidPriceC~", NA, NA, NA, 
NA, NA), AU3CB0256162 = c("MidPriceC~", NA, NA, NA, NA, "4"), 
    AU3CB0260321 = c("MidPriceC~", "Invalid_RIC.", NA, NA, NA, 
    NA), AU3CB0265239 = c("MidPriceC~", NA, NA, "3", NA, NA), 
    AU3CB0283190 = c("MidPriceC~", "Invalid_RIC.", NA, NA, NA, 
    NA), AU3SG0001928 = c("MidPriceC~", NA, NA, NA, NA, NA), 
    AU3SG0002371 = c("MidPriceC~", NA, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-6L))

【讨论】:

    【解决方案3】:

    使用dplyr 的解决方案。我们可以使用selectwhere 来应用一个函数来检查列是否包含某个字符串。 dat 来自 Andre Wildberg 的回答。

    library(dplyr)
    
    dat2 <- dat %>%
      select(where(function(x) all(!grepl("Invalid", x))))
    dat2
      #        ISIN AU3CB0243657 AU3CB0256162 AU3CB0265239 AU3SG0001928 AU3SG0002371
      # 1 Timestamp   MidPriceC~   MidPriceC~   MidPriceC~   MidPriceC~   MidPriceC~
      # 2     41275         <NA>         <NA>         <NA>         <NA>         <NA>
      # 3     41276         <NA>         <NA>         <NA>         <NA>         <NA>
      # 4     41277         <NA>         <NA>            3         <NA>         <NA>
      # 5     41278         <NA>         <NA>         <NA>         <NA>         <NA>
      # 6     41279         <NA>            4         <NA>         <NA>         <NA>
    

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2018-08-18
      • 1970-01-01
      • 2022-09-08
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多