【问题标题】:Sample a single row, per column, within a subset of a data frame in R, while following conditions在 R 中的数据框的子集中,每列对单行进行采样,同时遵循条件
【发布时间】:2016-03-27 04:19:33
【问题描述】:

作为我的数据示例,我在数据框中有 GROUP 1 和三行数据,GROUP 2 有两行数据:

GROUP   VARIABLE 1   VARIABLE 2   VARIABLE 3 
    1            2            6            5 
    1            4           NA            1 
    1           NA            3            8
    2            1           NA            2      
    2            9           NA           NA 

我想从 GROUP 1 中的每列对单个变量进行采样,以创建代表 GROUP 1 的新行。我不想从 GROUP 1 中采样一个完整的行,而是需要单独进行采样对于每一列。我想对 GROUP 2 做同样的事情。此外,采样不应考虑/包括 NA,除非该组变量的所有行都有 NA(例如上面的 GROUP 2、VARIABLE 2)。

例如,采样后,我可能会得到这样的结果:

GROUP   VARIABLE 1   VARIABLE 2   VARIABLE 3 
    1            4            6            1 
    2            9           NA            2 

只有第 2 组变量 2 可以在此处生成 NA。我实际上有 39 个组、50,000 多个变量和大量 NA。我真诚地感谢代码制作一个新的行数据框,每行都有每组的采样结果。

【问题讨论】:

    标签: r dataframe subset sample missing-data


    【解决方案1】:

    我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'GROUP'分组,我们循环遍历列(lapply(.SD,),ifall的元素是NA我们返回NA否则我们会得到非 NA 元素的 sample

    library(data.table)
    setDT(df1)[,lapply(.SD, function(x)
         if(all(is.na(x))) NA_integer_ else sample(na.omit(x),1)) , by = GROUP]
    

    【讨论】:

    • 如何替换这段代码中的 x?代码不是在每个组中进行抽样,而是为每个组生成一个整数,表示有多少行不是“NA”。我猜我误解了如何将我的数据框插入到代码中。这是我写的(TABLE 是我的数据框的名称):setDT(TABLE)[,lapply(.SD, function(TABLE) if(all(is.na(TABLE))) NA_integer_ else sample(na.omit(TABLE),1)) , by = TABLE$GROUP]
    • @user3545679 根据您显示的输入数据,我得到了预期的输出。如果TABLE是数据集的名称,为什么你在function(TABLE)中使用,function(x)似乎不那么罗嗦
    • 我认为问题可能在于我现在实际上是在处理一个由字母组成的数据框,而不是数字。结果,对于某些列,我得到了组中存在多少个字母(不是 NA)的整数。我应该再次问我的问题,而不是字母吗?而且,是的,我现在使用 x 而不是 TABLE。
    • @user3545679 如果您的列是 character 然后使用 NA_character_ 。如果这没有帮助,请考虑使用可重现的示例和预期输出提出一个新问题。
    • 相关问题,关于数据表中的字符和使用此函数的警告,在这里提问:stackoverflow.com/questions/34711685/…
    【解决方案2】:

    要忽略NAs,只需将一个参数传递给汇总函数na.rm = TRUE。它会忽略所有NAs。

    我使用dplyr 来执行请求的分组,但您也可以使用基本函数。 dplyr 易于使用和阅读。

    下面是代码

    如果所有列的汇总功能都相同,您可以使用summarise_each 并一次性进行分组。

    library(dplyr)
    
        df = df %>%
          group_by(Group) %>%
          summarise(Var_1 = max(Var_1, na.rm = TRUE),Var_2 = max(Var_2, na.rm = TRUE),Var_3 = min(Var_3, na.rm = TRUE))
    

    【讨论】:

    • 您的代码计算变量的最大值和最小值,而不是随机选取的值,这对于具有 50k+ 个变量的 op 的真实数据是不切实际的。
    • 我刚刚使用了 max/min,只是为了说明。可以使用适合他们需要的任何其他聚合函数(甚至自定义函数)。如果 OP 需要选择一个随机数。他/她可以使用 Sample 函数来选择一个随机数。
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2016-02-12
    相关资源
    最近更新 更多