【问题标题】:How can I remove the rows from a dataset which include "NA" values and less than the required amount of data?如何从包含“NA”值且少于所需数据量的数据集中删除行?
【发布时间】:2019-04-06 17:04:49
【问题描述】:

我有这个数据集,其中包括一家公司在给定年份的所有销售额(公司代码 = gvkey,年份 = fyeqarq,销售额 = 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】:

    我们可以做一个group_byfilter

    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 或少于 10 个 'fyearq' 数据的 any 'gvkey',

    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()
    

    【讨论】:

    • 为什么要加any?!
    • @NelsonGon 我猜如果有任何 NA 元素,OP 想要整体删除“gvkey”,因为从描述中,它说na.omit 不起作用,因为它只删除了 NA 行.
    • 非常感谢您的帮助。我刚刚注意到的最后一件事是,每年必须出现 4 次,原因是销售额除以一年中的每个季度。例如,公司 1428 应该有 4 个 1987 年的“销售”对象,但只显示一个,因为它可能只披露了其中一个季度的销售额。如何修改它以包含此条件?
    • @CreditDefaultSwap 在这种情况下,您可能需要在filter 中添加&amp; all(table(fyearq) == 4)
    猜你喜欢
    • 2019-09-13
    • 2013-08-09
    • 1970-01-01
    • 2023-03-04
    • 2016-05-18
    • 2021-12-25
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多