【问题标题】:R: dropping all observations within a groupR:删除组内的所有观察
【发布时间】:2019-12-12 00:21:31
【问题描述】:

我有一组 500 家公司的投资数据超过六年。我想创建一个仅包含所有六年数据的公司的平衡面板,但我似乎无法在 R 中找到一种简单的方法。

我的数据如下:

IMAGE

如果一家公司只有一年的缺失值,我想放弃所有年份的公司。我尝试了不同的条件子集命令,但没有什么对我有用。想法?

【问题讨论】:

  • 如果一家公司最多只能有 6 年的实际数据,您可以过滤掉任何 NA/NULL 的“输出”值,按公司分组,汇总以获取记录数,然后您将收到每个公司有多少记录的列表。您唯一要保留的是 = 6 的那些(即 6 年的数据)。如果您为这些公司过滤该列表,那么您就有了用于过滤原始数据集的列表。
  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 请不要发布代码/数据/错误的图像:它不能被复制或搜索 (SEO),它会破坏屏幕阅读器,并且它可能不适合某些移动设备。参考:meta.stackoverflow.com/a/285557/3358272(和xkcd.com/2116)。请直接包含代码或数据(例如,dput(head(x))data.frame(...))。

标签: r conditional-statements subset


【解决方案1】:

三种方法:

dat <- data.frame(
  firm = c(1, 1, 1, 2,  2,  2),
  year = c(1, 2, 3, 1,  2,  3),
  val  = c(1, 1, 1, 2, NA, NA)
)

基础 R

do.call(
  rbind.data.frame,
  by(dat, dat$firm, function(x) if (!any(is.na(x$val))) x)
)
#     year firm val
# 1.1    1    1   1
# 1.2    2    1   1
# 1.3    3    1   1

datrm <- dat[!complete.cases(dat),]
dat[ !dat$firm %in% datrm$firm, ]

data.table

library(data.table)
datDT <- as.data.table(dat)
datDT[, .SD[!any(is.na(val)),], by = "firm" ]

dplyr

library(dplyr)
dat %>%
  group_by(firm) %>%
  filter(!any(is.na(val))) %>%
  ungroup()

【讨论】:

  • data.table 设置完美运行!非常感谢!
  • 如果足够好,请accept the answer。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2023-02-07
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
相关资源
最近更新 更多