如果任何值为非正数,则将行替换为NA

时间:2017-08-04 18:35:26

标签: r apply

我的数据集类似于以下内容:

DiagnosticDescriptor

我正在尝试获得以下结果:df <- data.frame( A = c(-1, 2, 3), B = c(1, 1, -1)) df # A B # 1 -1 1 # 2 2 1 # 3 3 -1 A均为正值时保留值:

B

我已尝试 A B 1 NA NA 2 2 1 3 NA NA ,但当df2 <- apply(df, 1:2, function(x) if (x > 0) x else NA)A为正数时,它会返回值。如何添加第二个条件?

2 个答案:

答案 0 :(得分:6)

如果所有值在该行中为正值,则可以将每列乘以值为1的向量,否则取值NA:

df * ifelse(rowSums(df <= 0) > 0, NA, 1)
#    A  B
# 1 NA NA
# 2  2  1
# 3 NA NA

答案 1 :(得分:2)

replicate(NCOL(df), Reduce('|', lapply(df, function(x) x < 0)))可以给出应该替换NA的索引。它正在检查每列中是否至少有一个小于零的值。

replace(df, replicate(NCOL(df), Reduce('|', lapply(df, function(x) x < 0))), NA)
#   A  B
#1 NA NA
#2  2  1
#3 NA NA

或者

df[which(!rowSums(df >= 0) == NCOL(df)),] = NA
df
#   A  B
#1 NA NA
#2  2  1
#3 NA NA