r-如果一行包含一个值,如何删除列



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

我想做相反的事情并将其推广。如果列中的任何一行包含某个字符串,我想删除每一列。(为了与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。我不确定这是否会影响某些功能的能力。

数据帧为:

> 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的列。

您可以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))

使用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>

最新更新