在R中基于数据集中重复数据不足的情况下删除行

5

我希望对大量数据进行4天滚动平均。问题在于有些人没有4个案例,因此我会收到一个错误提示,指出k <= n不为TRUE。

是否有一种方法可以从数据集中删除任何没有足够数据的个体?

以下是数据的示例:

     Name  variable.1
1     Kim   64.703950
2     Kim  926.339849
3     Kim  128.662977
4     Kim  290.888594
5     Kim  869.418523
6     Bob  594.973849
7     Bob  408.159544
8     Bob  609.140928
9  Joseph  496.779712
10 Joseph  444.028668
11 Joseph -213.375635
12 Joseph  -76.728981
13 Joseph  265.642784
14   Hank  -91.646728
15   Hank  170.209746
16   Hank   97.889889
17   Hank   12.069074
18   Hank  402.361731
19   Earl  721.941796
20   Earl    4.823148
21   Earl  696.299627
4个回答

4

如果你的数据框是 df,你可以使用 dplyr 删除出现少于4次的所有名称:

library(dplyr)

df %>%
  group_by(Name) %>%
  filter(n() >= 4)

完美运行。谢谢! - user3585829
您可能会发现阅读dplyr的介绍很有用。 - davechilders
谢谢。dplyr似乎是一个非常有用的包。这将帮助我熟悉它。 - user3585829

2

尝试:

library(zoo)
library(dplyr)
df %>%
  group_by(Name) %>%
  filter(n() >= 4) %>%
  mutate(daymean = rollmean(variable.1, 4, align="right", na.pad=TRUE))

这将仅保留大于或等于4的组,并在 variable.1 上计算一个为期4天的滚动平均。

#     Name variable.1  daymean
#1     Kim   64.70395       NA
#2     Kim  926.33985       NA
#3     Kim  128.66298       NA
#4     Kim  290.88859 352.6488
#5     Kim  869.41852 553.8275
#6  Joseph  496.77971       NA
#7  Joseph  444.02867       NA
#8  Joseph -213.37563       NA
#9  Joseph  -76.72898 162.6759
#10 Joseph  265.64278 104.8917
#11   Hank  -91.64673       NA
#12   Hank  170.20975       NA
#13   Hank   97.88989       NA
#14   Hank   12.06907  47.1305
#15   Hank  402.36173 170.6326

0

这里有两个基本选项,一个是使用ave函数,我们可以生成一个向量,其中对于组中的每一行,该组的长度都相同(ave函数将循环使用其结果以填充组):

subset(DF, ave(seq(Name), Name, FUN=length) > 4)

另一个使用table的方法,我们在每个组中计算项目数,并使用%in%仅保留属于具有足够项目的组的行。

subset(DF, Name %in% names(table(Name)[table(Name) > 4]))

两者都会产生:

     Name variable.1
1     Kim   64.70395
2     Kim  926.33985
3     Kim  128.66298
4     Kim  290.88859
5     Kim  869.41852
9  Joseph  496.77971
10 Joseph  444.02867
11 Joseph -213.37563
12 Joseph  -76.72898
13 Joseph  265.64278
14   Hank  -91.64673
15   Hank  170.20975
16   Hank   97.88989
17   Hank   12.06907
18   Hank  402.36173

那是一个简单的解决方案。谢谢。 - user3585829

0
你可以创建一个第二个数据框,将其聚合到用户级别,并为每个用户计数。然后按用户将该数据框连接到原始数据框上,然后将新数据框子集化到计数>=4的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接