我有一个包含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
关键字可以是任何格式,如字符串或数字的组合,或两者兼而有之。
答案 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