【问题标题】:Subsetting a table of two variables to remove the 0 values对包含两个变量的表进行子集化以删除 0 值
【发布时间】:2016-08-20 19:28:20
【问题描述】:

我有一个表格,例如以下示例,它是从 df 获得的(0==控制;1==案例;标题数字是分层的):

   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 

但还没有走得更远。

【问题讨论】:

  • 你能展示一个可重现的例子吗?是否要根据 'status' 列 0 元素删除 'df' 中的行?
  • df[, colSums(df == 0) == 0]

标签: r subset


【解决方案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“status”中unique元素的length大于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)

【讨论】:

  • 使用 dimnames 和 colSums 的子集对我有用。任何想法如何确认我只丢失了我需要的科目?目前,我只能通过使用 length(which(table(df$status, df$strata)==0)) 来确认由于 0 频率而“丢失”的层数。
  • @javivr 我没有得到确认部分。应用的逻辑(对于 dplyr 和 data.table 解决方案)是如果在按“层”分组后“状态”中唯一元素的长度大于 1,我们仅过滤组中满足条件的那些元素。那么,这不是一种确认吗?
  • 我想同样的逻辑也适用于使用 dimnames 和 colSums,对吧?如果是这样,则无需确认。感谢您的帮助。
  • @javivr 是的,同样的逻辑适用于我们在逻辑矩阵上执行colSums,然后检查它是否为0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多