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

How to replace values in column if the count do not reach certain condition

我有以下示例数据集

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 的计数小于三(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,但我不知道如何添加条件(即计数)。

尝试使用 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)]

在基地 R

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