Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 删除具有少于三个唯一观察值的组_R_Subset_R Faq_Data.table - Fatal编程技术网

R 删除具有少于三个唯一观察值的组

R 删除具有少于三个唯一观察值的组,r,subset,r-faq,data.table,R,Subset,R Faq,Data.table,我想将我的数据框子集,只保留在不同日期有3次或更多观察的组。我想去掉那些观察次数少于3次的小组,或者他们的观察次数不是3天的 以下是一个示例数据集: Group Day 1 1 1 3 1 5 1 5 2 2 2 2 2 4 2 4 3 1 3 2 3 3 4 1 4 5 因此,对于上述示例,将保留组1和组3,并从数据帧中删除组

我想将我的数据框子集,只保留在不同日期有3次或更多观察的组。我想去掉那些观察次数少于3次的小组,或者他们的观察次数不是3天的

以下是一个示例数据集:

Group   Day
1       1 
1       3
1       5
1       5
2       2
2       2  
2       4 
2       4
3       1
3       2
3       3
4       1
4       5
因此,对于上述示例,将保留组1和组3,并从数据帧中删除组2和4

我希望这是有意义的,我想解决方案会很简单,但我无法解决它(我对R很陌生,对这类问题的解决方案不是很快)。我想diff函数可能会派上用场,但没能走得更远。

有了它,您可以:

library(data.table)
DT[, if(uniqueN(Day) >= 3) .SD, by = Group]
其中:

或使用
dplyr

library(dplyr)
DT %>% 
  group_by(Group) %>% 
  filter(n_distinct(Day) >= 3)

这会给出相同的结果。

使用dplyr的一个想法

 library(dplyr)
 df %>% 
   group_by(Group) %>% 
   filter(length(unique(Day)) >= 3)

#Source: local data frame [7 x 2]
#Groups: Group [2]

#  Group   Day
#  (int) (int)
#1     1     1
#2     1     3
#3     1     5
#4     1     5
#5     3     1
#6     3     2
#7     3     3

我们可以使用
base R

i1 <-  rowSums(table(df1)!=0)>=3
subset(df1, Group %in% names(i1)[i1])
#    Group Day
#1      1   1
#2      1   3
#3      1   5
#4      1   5
#9      3   1
#10     3   2
#11     3   3

尝试
df[df$Group%以%as.numeric(名称(tapply(df$Day,df$Group,函数(x)长度(唯一(x))>=3)),]
@Jaap这是怎么回事
r-faq
?我不能把所有的事情都当作r-faq。当然,还有一些更一般、访问量更大的问题没有标注r-faq。你能解释一下吗?谢谢。不用
length(unique(Day))
你可以
n_distinct(Day)
Nice!谢谢@Arun@ProcrastinatusMaximus,我没有看到您使用
dplyr
解决方案进行了更新。我添加了
unique(length))
approach anyways.np,有几个选项总是好的;-)(顺便说一句:过滤语句中的
是不需要的,我已经冒昧地删除了;希望你不介意)谢谢@prolautiatusMaximus:)
i1 <-  rowSums(table(df1)!=0)>=3
subset(df1, Group %in% names(i1)[i1])
#    Group Day
#1      1   1
#2      1   3
#3      1   5
#4      1   5
#9      3   1
#10     3   2
#11     3   3
df1[with(df1, as.logical(ave(Day, Group, FUN = function(x) length(unique(x)) >=3))),]