子集两个变量的表以删除0值

时间:2016-08-20 19:28:21

标签: r subset

我有一个表,例如下面的样本,它是从df(0 == control; 1 == case;标题数字是分层)中获得的:

   208  209 210 211 212 213
0   4   16  3   5   2   0
1   0   7   2   0   6   2

我需要创建一个新的df,删除0个案例(1)或控件(0)的那些层。

到目前为止,我创建了以下代码,该代码使用逻辑创建了一个向量:

table(df$status, df$strata)>0 

但还没有成功。

1 个答案:

答案 0 :(得分:1)

我们可以使用subset

subset(df, strata %in% dimnames(tbl)[[2]][colSums(tbl==0)==0])
#  status strata
#1       0    211
#5       1    209
#7       0    209
#8       1    208
#9       1    211
#10      0    208

我认为问题不在于检查'df'是否等于0.事实上,OP希望根据频率对数据集进行子集化。

紧凑选项是使用data.table

library(data.table)
setDT(df)[, if(uniqueN(status)>1) .SD , by = .(strata)]
#    strata status
#1:    211      0
#2:    211      1
#3:    209      1
#4:    209      0
#5:    208      1
#6:    208      0

即。这里我们将'data.frame'转换为'data.table'(setDT(df)),按'strata'分组,if length unique元素'status'大于1(在本例中为2),我们得到Data.table的子集(.SD)。

使用dplyr中类似逻辑的选项是

library(dplyr)
df %>%
   group_by(strata) %>%
   filter(n_distinct(status)>1)

数据

set.seed(24)
df <- data.frame(status = sample(0:1, 10, replace=TRUE), 
           strata = sample(208:213, 10, replace = TRUE))

tbl <- table(df)