如何从数据集中删除包含“NA”值且小于所需数据量的行?

问题描述 投票:3回答:1

我有这个数据集,其中包括给定年份公司的所有销售额(公司代码= gvkey,年份= fyeqarq,sales = saley)。我想删除所有具有归属于公司的NA值的行。换句话说,从数据集中完全删除具有多个NA值的公司。我还需要删除所有没有至少11年销售额的公司。每年有四个值,因为它衡量每个季度的销售额。

我设法使用na.omit删除NA值本身,但我需要使用这两个条件从数据集中删除整个公司数据。

因此,从整个数据集dfUSA中,应该删除使用1001编码的公司。

df.clean <- na.omit(dfUSA)

以上只会删除NA值。但该公司仍将在那里。

      gvkey   fyearq   saley
1      1001    1983    4,921 
2      1001    1983    NA
3      1001    1983    NA
4      1001    1983    NA
5      1001    1984    6,434
6      1001    1984    NA
7      1001    1984    NA
8      1001    1984    NA
9      1001    1985    7,865
10     1001    1985    NA
11     1001    1985    NA
12     1001    1985    NA

它也只有3年的数据,这是它应该被删除的另一个原因。有些公司可能拥有所有销售价值,但不到11年的数据。所以我还需要一种方法来检查它。我怎样才能做到这一点?

它是我的第一篇文章,所以如果需要我可以提供更多信息。

r dataframe na
1个回答
2
投票

我们可以做一个group_by filter

library(dplyr)
df.clean <- dfUSA %>%
                   # group by the gvkey column
                   group_by(gvkey) %>%
                   # check whether there are any NA elements in saley
                   # negate (!) to change TRUE to FALSE and viceversa
                   # filter the logical vector so that it removes the whole group
                   filter(!any(is.na(saley)) %>%
                   # ungroup to be safe                   
                   ungroup()

如果打算删除具有NA的any'gvkey'或者具有少于10'fyearq'数据的那些,

dfUSA %>%
      group_by(gvkey) %>%
      # along with the earlier condition check the number of unique
      # fyearq and do the negation
      filter(!(any(is.na(saley)) & n_distinct(fyearq) < 10))%>%
      # ungroup to be safe                   
       ungroup()
© www.soinside.com 2019 - 2024. All rights reserved.