在清理大量数据时,我遇到了以下问题:
我有一个包含干净列和不干净列的数据框我想通过替换数据来清理(我必须保留两列)。
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))
答案 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