R条件运算(数据传输) - 仅处理数据子集 - 避免循环

时间:2014-07-29 09:29:05

标签: r

在清理大量数据时,我遇到了以下问题:

我有一个包含干净列和不干净列的数据框我想通过替换数据来清理(我必须保留两列)。

data1 <- c("a01", "a2", "a03", "a1", "a08")
data2 <- c("a01", "a02", "a03", "a01", "a08")
df <- data.frame(data1, data2)

我做了一个测试,在测试结果列

中给出了TRUE FALSE值
df$dataClean <- grepl("^[a-z][0-9]$", df$data1)

现在我想只在条件= TRUE的部分执行操作。基本上我想用其他人替换一些值...但我想有一些灵活的解决方案我可以适应几个用例。

我的第一次尝试不起作用,但这是我想遵循的理念:没有循环工作......

df$data1 <- df$data2[df$dataClean]
Error in `$<-.data.frame`(`*tmp*`, "data1", value = c(2L, 1L)) : replacement has 2 rows, data has 5

在excel中,我习惯了这些任务的数组公式...我想看一下R中的等价物我想:)

编辑: 其实我找到了这个,但它不是循环吗? :

df$data1 <- ifelse(df$dataClean, as.character(df$data2), as.character(df$data1))

1 个答案:

答案 0 :(得分:0)

以下是ifelse方法的替代方法,但它取决于“data1”和“data2”是字符列,而不是factor s。

## Your data -- but with stringsAsFactors = FALSE
data1 <- c("a01", "a2", "a03", "a1", "a08")
data2 <- c("a01", "a02", "a03", "a01", "a08")
df <- data.frame(data1, data2, stringsAsFactors = FALSE)
df
#   data1 data2
# 1   a01   a01
# 2    a2   a02
# 3   a03   a03
# 4    a1   a01
# 5   a08   a08

df$dataClean <- grepl("^[a-z][0-9]$", df$data1)

## Just basic extraction and substitution
df$data1[df$dataClean] <- df$data2[df$dataClean]
df
#   data1 data2 dataClean
# 1   a01   a01     FALSE
# 2   a02   a02      TRUE
# 3   a03   a03     FALSE
# 4   a01   a01      TRUE
# 5   a08   a08     FALSE