如何使用每组的行数作为条件对数据框进行子集化

Posted

技术标签:

【中文标题】如何使用每组的行数作为条件对数据框进行子集化【英文标题】:How to subset a dataframe using the number of rows per group as a condition 【发布时间】:2022-01-09 18:15:21 【问题描述】:

我进行了一项日记研究,为期 5 天,参与者必须回答 2 次。

我的标准是,人们必须在 5 天中至少回答 3 天。因此,在进行问卷调查的总共 10 次中,他们必须回答至少 6 次。 每次他们填写问卷时都必须输入个人代码,这就是为什么我可以看到谁回答了多少次。

我是这样写的:

Morning_Afternoon_PT_EN:是数据库的名称

respfreq <- calc.nomiss(Morning_Afternoon_PT_EN$day, tolower(Morning_Afternoon_PT_EN$code), data=Morning_Afternoon_PT_EN)
print(respfreq)

enter image description here

   952345172    alju12    amou79    amou91    baab81 
        0         5        10        10        10        10 
   base85    beju58    cade61    caju21    chno45    crju09 
       10        10        10        10         5         7 
   faap52    fuau48    fude38    fuma07    huju03    leja26 
       10         8         3        10         8        10 
   leju40    lema32    leno81    liab14    liab20    liab50 
       10         9         8         9        10         9 
  liabr14    liag30    liag60   liap520    liau35    lide50 
        1        10         9        10         9         9 
   life10    life74    lija05    lija45    lija78    liju65 
        9         1        10        10         9        10 
   liju94    lima40    lima82    limf96    lioc46    lioc84 
        9        10        10         4        10        10 
   lise50    lise88    maab31    moag91    moap58    pode04 
        9        10        10        10         9         8 
   sade61    saja28    saja79    saoc06    sema72    sema83 
        9        10        10         9        10        10 
   tose37    vima32 
        9         9 
length(respfreq)
[1] 56

所以,我看到“952345172”、“chno45”、“limf96”、“liabr14”、“life74”、“fude38”不符合要求,我想消除它们整个数据库。

我尝试使用子集,例如:

NewDataFrame<-subset(Morning_Afternoon_PT_EN, respfreq>6)

但是,我得到了答案:

NewDataFrame6)

错误:必须使用有效的下标向量对行进行子集化。 i 逻辑 下标必须与索引输入的大小相匹配。 x 输入有大小 485 但下标 r 的大小为 56。

我了解错误,但我不知道如何解决。

【问题讨论】:

请不要发布数据或代码的照片!如果您这样做,愿意帮助您的人将不得不输入所有文本。而是提供minimal reproducible example这里是a good overview on how to ask a good question 【参考方案1】:

您应该在数据框中包含带有计数的列才能使用subset

x <- c("952345172", "alju12", "amou79", "amou91", "baab81", NA)

code <- rep(x, c(5, 10, 10, 20, 2, 7))

df <- data.frame(id = 1:length(code), code)

head(df)

##   id      code
## 1  1 952345172
## 2  2 952345172
## 3  3 952345172
## 4  4 952345172
## 5  5 952345172
## 6  6    alju12
library(dplyr)

df2 <- left_join(df, na.omit(df) |> count(code)) 

df2 <- subset(df2, n > 6)

head(df2)

##    id   code  n
## 6   6 alju12 10
## 7   7 alju12 10
## 8   8 alju12 10
## 9   9 alju12 10
## 10 10 alju12 10
## 11 11 alju12 10

另一种选择是使用:

tabc <- table(df$code)

df3 <- df[df$code %in% names(tabc[tabc > 6 ]), ]

【讨论】:

以上是关于如何使用每组的行数作为条件对数据框进行子集化的主要内容,如果未能解决你的问题,请参考以下文章

计算每组的行数并将结果添加到原始数据框

如何在不使用左连接的情况下根据“OR”条件对数据框进行子集化? [复制]

如何使用“OR”组合多个条件以对数据框进行子集化?

如何在Python中对满足某些条件的行进行子集[重复]

如何在条件满足之前用 N 行中的一些对条件行进行子集化,比我的代码更快?

如何对 SparkR 数据框进行子集化