基于每列中的观察数的子集数据帧

时间:2018-12-06 08:04:25

标签: r dataframe subset

我有一个问题想请我帮忙。我试图提出解决方案,但是我不知道如何解决。

请使用它来重新创建我的数据框。

<asp:TextBox ID="txtDateFromEvent" runat="server"></asp:TextBox>
<asp:TextBox ID="txtDateToEvent" runat="server"></asp:TextBox>

<script type="text/javascript">
    $(document).ready(function () {

        $('body').on('blur','input[id*=txtDateToEvent]', '', function () {
            if ($(this).val() == '') {
                $(this).val($('input[id*=txtDateFromEvent]').val());
            }
        });

    });
</script>

我有这个数据框:

structure(list(A1 = c(87L, 67L, 80L, 36L, 71L, 6L, 26L, 15L, 
14L, 46L, 19L, 93L, 5L, 94L), A2 = c(50L, NA, 73L, 58L, 47L, 
74L, 39L, NA, NA, NA, NA, NA, NA, NA), A3 = c(NA, 38L, 10L, 41L, 
NA, 66L, NA, 7L, 29L, NA, 70L, 23L, 46L, 55L)), .Names = c("A1", 
"A2", "A3"), class = "data.frame", row.names = c(NA, -14L))

在每列有7个观察值(计数)以上的情况下,如何对数据帧进行切片? 因此,所需的输出看起来像这样(我们观察到的结果是每列> = 7):

A1  A2  A3
87  50  NA
67  NA  38
80  73  10
36  58  41
71  47  NA
6   74  66
26  39  NA
15  NA  7
14  NA  29
46  NA  NA
19  NA  70
93  NA  23
5   NA  46
94  NA  55

我欢迎任何可以推广到更多专栏的解决方案。

1 个答案:

答案 0 :(得分:6)

尝试

df1[, colSums(!is.na(df1)) >= 7]
#   A1 A3
#1  87 NA
#2  67 38
#3  80 10
#4  36 41
#5  71 NA
#6   6 66
#7  26 NA
#8  15  7
#9  14 29
#10 46 NA
#11 19 70
#12 93 23
#13  5 46
#14 94 55

逐步

首先需要做的是找出数据中哪些值不丢失。

!is.na(df1)

这将返回逻辑矩阵

#        A1    A2    A3
# [1,] TRUE  TRUE FALSE
# [2,] TRUE FALSE  TRUE
# [3,] TRUE  TRUE  TRUE
# [4,] TRUE  TRUE  TRUE
# [5,] TRUE  TRUE FALSE
# [6,] TRUE  TRUE  TRUE
# [7,] TRUE  TRUE FALSE
# [8,] TRUE FALSE  TRUE
# [9,] TRUE FALSE  TRUE
#[10,] TRUE FALSE FALSE
#[11,] TRUE FALSE  TRUE
#[12,] TRUE FALSE  TRUE
#[13,] TRUE FALSE  TRUE
#[14,] TRUE FALSE  TRUE

使用colSums来查找每列中没有丢失多少观察值

colSums(!is.na(df1))
#A1 A2 A3 
#14  6 10

应用条件为“每列大于或等于7个观察值(计数)”

colSums(!is.na(df1)) >= 7
#   A1    A2    A3 
# TRUE FALSE  TRUE

最后,您需要使用此向量来子集数据

df1[, colSums(!is.na(df1)) >= 7]

如果需要定期将其转换为功能

almost_complete_cols <- function(data, min_obs) {
  data[, colSums(!is.na(data)) >= min_obs, drop = FALSE]
}

almost_complete_cols(df1, 7)