0

我有一个很长的数据集和一个相对较短的 ID 值列表,其中我的数据是错误的。以下工作,但我的 wrong_IDs 向量实际上要大得多:

wrong_IDs <- c('A1', 'B3', 'B7', 'Z31')
df$var1[df$var2 == 'A1' | df$var2 == 'B3' | df$var2 == 'B7' | df$var2 == 'Z31'] <- 0L

这看起来很基本,但我还没有找到一种紧凑的方式来编写它。谢谢你的帮助

4

2 回答 2

1

您可以使用 %in% 运算符将您的数据与 wrong_IDs 进行比较

df <- data.frame("var1" = 101:120, "var2" = c(1:20))
wrong_ids <- c(3, 5, 7)
df$var1[df$var2 %in% wrong_ids] <- 0

其中 df$var2 %in% wrong_ids 为您提供一个 TRUE/FALSE 布尔向量,该向量仅对所选行(此处为第 3、5 和 7 行)应用“设置为零”操作。

于 2020-05-05T14:02:34.990 回答
1

这是一个使用和正则表达式的非常紧凑的解决方案grepl

一些说明性数据:

set.seed(123)
df <- data.frame(
  ID = paste0(rep(LETTERS[1:3], 2), sample(1:3, 6, replace = T)),
  Var2 = rnorm(6),
  stringsAsFactors = F)
df

wrong_IDs <- c('A1', 'B3', 'B1', 'C3')

要将那些包含 的行设置为 0,wrong_IDs您可以将这些值折叠成一个仅由正则表达式交替运算符分隔的字符串,|并指示grepl匹配这些替代模式df$ID

df$ID <- ifelse(grepl(paste0(wrong_IDs, collapse = "|"), df$ID), 0, df$ID)
df
  ID        Var2
1  0  0.07050839
2  0  0.12928774
3 C2  1.71506499
4 A3  0.46091621
5  0 -1.26506123
6 C1 -0.68685285
于 2020-05-05T14:29:35.247 回答