如果计数未达到某个条件,如何替换列中的值

时间:2017-05-23 15:07:12

标签: r plyr

我有以下示例数据集

df1 <- c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2)
df2 <- c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 2)
df <- data.frame(df1, df2)

如果计数2小于3(df1中的计数2为2且df2中的计数为4),我想将每列中的值2替换为NA。因此我的预期结果是

 df1 df2
   1   1
   1   1
   1   1
   1   1
   1   1
   1   1
   0   0
   0   0
   0   0
   0   0
   0   0
   0   2
   0   2
  NA   2
  NA   2

我知道如何直接替换值,例如df$df1[df$df1 == 2] <- NA,但我不确定如何添加条件(即计数)。

2 个答案:

答案 0 :(得分:1)

在Base R

df1[df1==names(which(table(df1) < 3))] = NA
df2[df2==names(which(table(df2) < 3))] = NA

答案 1 :(得分:0)

尝试使用data.table,它更快更容易。为了您的目的,这应该

df1 <- c(1,1,1,1,1,1,0,0,0,0,0,0,0,2,2)
df2 <- c(1,1,1,1,1,1,0,0,0,0,0,2,2,2,2)
df <- data.frame(df1,df2)
library(data.table)
dt<- as.data.table(df)
dt[df1==2,df1:=NA]

如果您想添加条件,可以执行类似

的操作
df1 <- c(1,1,1,1,1,1,0,0,0,0,0,0,0,2,2)
df2 <- c(1,1,1,1,1,1,0,0,0,0,0,2,2,1,2)
df <- data.frame(df1,df2)
library(data.table)
dt<- as.data.table(df)
dt[df1==2,df1:=ifelse(df2==1,NA,df1)]