我有一个表,例如下面的样本,它是从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
但还没有成功。
答案 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)