我写了一个功能for循环,但它的成千上万行缓慢,我正在寻找更有效的替代方案。提前谢谢!
任务:
a
与列b
匹配,则列d
变为NA
。 a
与b
不匹配,但b
与c
匹配,则列e
成为
NA
。for循环:
for (i in 1:nrow(data)) {
if (data$a[i] == data$b[i]) {data$d[i] <- NA}
if (!(data$a[i] == data$b[i]) & data$b[i] == data$c[i])
{data$e[i] <- NA}
}
一个例子:
a b c d e
F G G 1 10
F G F 5 10
F F F 2 8
会变成:
a b c d e
F G G 1 NA
F G F 5 10
F F F NA 8
答案 0 :(得分:4)
如果你担心速度和效率,我建议data.table
(虽然按照@parfait的建议技术上对普通data.frame
进行矢量化可能会加快速度
library(data.table)
DT <- fread("a b c d e
F G G 1 10
F G F 5 10
F F F 2 8")
print(DT)
# a b c d e
# 1: F G G 1 10
# 2: F G F 5 10
# 3: F F F 2 8
DT[a == b, d := NA]
DT[!a == b & b == c, e := NA]
print(DT)
# a b c d e
# 1: F G G 1 NA
# 2: F G F 5 10
# 3: F F F NA 8
答案 1 :(得分:2)
假设df
是您的数据:
ab <- with(df, a==b)
bc <- with(df, b==c)
df$d[ab] <- NA
df$e[!ab & bc] <- NA
会导致
# a b c d e
# 1 F G G 1 NA
# 2 F G F 5 10
# 3 F F F NA 8
答案 2 :(得分:0)
我们可以创建一个quosure列表并对其进行评估
library(tidyverse)
qs <- setNames(quos(d*NA^(a == b), e*NA^((!(a ==b) & (b == c)))), c("d", "e"))
df1 %>%
mutate(!!! qs)
# a b c d e
#1 F G G 1 NA
#2 F G F 5 10
#3 F F F NA 8