从多行和多列中删除字符

时间:2018-04-23 07:17:01

标签: r dataframe

我有一个包含150k行和40列的数据集。数据集由字符,字符串和整数组成。我想删除包含我要删除的特定关键字/短语的特定单元格。 例如, 如果初始数据集看起来像

            A            B
 1)             1 | My name is Sam.
 2)         Hello | 2
 3)   Who are you | The water is green.

我想删除包含关键字"是"的单元格。这样最终的数据集将如下所示: -

            A            B
 1)             1 | NA
 2)         Hello | 2
 3)   Who are you | NA

关键字可以是任何格式,如字符串或数字的组合,或两者兼而有之。

2 个答案:

答案 0 :(得分:2)

我们可以通过使用NA

创建逻辑索引,将其分配给grep
df1$B[grepl("\\bis\\b", df1$B)] <- NA

如果is也可以是子字符串,则删除字边界

df1$B[grepl("is", df1$B)] <- NA

OP也可能想要将所有非数字元素分配给NA。在这种情况下,只需将列转换为numeric(假设它是character类)

df1$B <- as.numeric(df1$B)

更新

如果有多列,那么我们可以使用lapply

colsofInterest <- 2:ncol(df1)
df1[colsofInterest] <- lapply(df1[colsofInterest],
         function(x) replace(x, grepl("\\bis\\b", x), NA))

或者也可以使用tidyverse

完成此操作
library(tdivyerse)
df1 %>%
     mutate_at(vars(colsofInterest), funs(replace(., str_detect(., "\\bis\\b"), NA)))

答案 1 :(得分:2)

使用grepl,您可以替换包含单词“is”的单个列中的条目,如Akrun所示。要使所有列都出现这种情况,您可以先将数据帧转换为向量,然后使用“is”对字符串进行分解,然后重建数据帧。

k <- 150
n <- 1000 * k
df1 <- data.frame(matrix(sample(c("Hi, my name is Khal Drogo", "Hello Khal Drogo", 1, 2), replace = T, size = n), ncol = k))

dfvec <- as.vector(unlist(df1))
dfvec[grepl("\\bis\\b", dfvec)] <- NA
df1 <- data.frame(matrix(dfvec, ncol = k))
head(df1[,1:5])

这给出了这个:

> head(df1[,1:5])
                X1               X2               X3               X4               X5
1 Hello Khal Drogo             <NA>                1                2                1
2 Hello Khal Drogo                2             <NA>                1 Hello Khal Drogo
3 Hello Khal Drogo Hello Khal Drogo                1                1             <NA>
4             <NA>                1 Hello Khal Drogo                2                2
5                2 Hello Khal Drogo             <NA>                2                1
6                2 Hello Khal Drogo Hello Khal Drogo Hello Khal Drogo                2