当前位置: 首页 > 知识库问答 >
问题:

如果只有第一个观察符合一个标准,有没有办法子集一个组?

艾成益
2023-03-14
ID = c(1,1,1,2,2,2,3,3,3,4,4,4,4)
VAR_1 = c(2,4,6,1,7,9,4,4,3,1,7,4,0)
VAR_2 = c(NA,NA,NA,NA,NA,20190101,20190101,20190101,NA,20190101,NA,NA,NA)
df2 = data.frame(ID,VAR_1,VAR_2)
df                                       df_subset   

ID VAR_1 VAR_2                           ID VAR_1 VAR_2
1   2     NA                             3   4     20190101                           
1   4     NA                             3   4     20190101
1   6     NA                             3   3     NA
2   1     NA                             4   1     20190101
2   7     NA                             4   7     NA
2   9     20190101                       4   4     NA
3   4     20190101                       4   0     NA
3   4     20190101
3   3     NA
4   1     20190101
4   7     NA
4   4     NA
4   0     NA

我通过几个步骤完成了这一过程(我对原始数据进行了子集,只按组进行第一次观察,给VAR_1赋一个特殊值,重新合并,然后最后按特殊值进行过滤),但我想知道是否有更简单、更优雅(可能也是)更有效的方法。我不需要VAR_1,所以如果需要,可以更改VAR_1,以提供更快的解决方案。

如有任何帮助,不胜感激。

共有1个答案

曹自怡
2023-03-14

使用dplyr,我们可以group_byID,并且仅当每个组中的第一个值是非na时才选择组。

library(dplyr)

df2 %>%
  group_by(ID) %>%
  filter(!is.na(VAR_2[1L]))

#     ID VAR_1    VAR_2
#  <dbl> <dbl>    <dbl>
#1     3     4 20190101
#2     3     4 20190101
#3     3     3       NA
#4     4     1 20190101
#5     4     7       NA
#6     4     4       NA
#7     4     0       NA

提取第一个值的一些变体可以是(感谢@tmfmnk)

df2 %>%  group_by(ID) %>% filter(!is.na(first(VAR_2)))

df2 %>% group_by(ID) %>%  filter(!is.na(nth(VAR_2, 1)))
df2[with(df2, ave(!is.na(VAR_2), ID, FUN = function(x) x[1L])), ]
subset(df2, ID %in% names(na.omit(sapply(split(df2$VAR_2, df2$ID), head, 1))))
 类似资料:
  • 问题内容: 根据MDN 文档: 该 方法冻结对象:即,防止向其添加新属性;防止现有属性被删除;并防止更改现有属性或其可枚举性,可配置性或可写性。本质上,对象实际上是不可变的。该方法返回被冻结的对象。 我期望在某个日期调用冻结会阻止对该日期进行更改,但是它似乎没有用。这是我正在做的(运行Node.js v5.3.0): 我本以为调用会失败或什么都不做。任何想法如何冻结日期? 问题答案: 有没有办法O

  • 我有一个关于接口的问题,比如: 现在,我需要这只猫去抓一只老鼠void catchMouse(){std::cout 有几种可能的解决方案,但看起来都不好。 > 在IAnim中添加一个方法,然后使用AnimalFactory创建猫后,我可以从IAnimal调用catchMouse()方法。但是catchMouse并不适用于所有动物,狗不catchMouse。将方法添加到IEM会污染界面,嗅到代码。

  • 我有一个需求,我想找到运行的jar中的jar的路径。假设有一个名为example-1.0.0.jar的罐子在一个名为main-1.0.0.jar.的运行罐子里,我想知道运行罐子里存在的罐子的路径。 编辑1:例如,jar是项目中的一个依赖项。例如,假设我的项目中有一个log4j依赖项,我想知道log4j jar在类中的路径。我怎样才能找到路?

  • 问题内容: 我不断收到错误: “路由器”可能只有一个子元素 使用react-router时。 我似乎无法弄清楚为什么它不起作用,因为它与示例中显示的代码完全一样:快速入门 这是我的代码: 感谢您的帮助 问题答案: 您必须将您的换行到(或)中。 应该 jsfiddle / webpackbin

  • 问题内容: 我对这种函数式编程和流技术有点陌生,但是我所知道的一点却非常有用! 我遇到过几次这种情况: 我真正想要的是: 我认为,除了与结合使用外,该东西在其他情况下也可能有用。当我成为超级n00b时,我花了很多时间重新发明Java Collections Framework,因为我不知道它在那里,所以我试图不重蹈覆辙。Java是否提供了执行此操作的好方法?我说错了吗? 谢谢! 编辑:这是案例的一

  • 我使用的界面看起来大致如下: 并且我目前正在使用一个匿名类来实现接口,但我并不关心这两种方法中的一种。大致如下: 现在,我已经在Java8中尽可能地使用新的lambda表达式,我想在这种情况下使用增加的简单性。毕竟,我只是在实现其中的一个方法,但由于接口中有两个方法,所以我不能在一个lambda表达式中使用它。