【问题标题】:returning values from all columns in a data frame after subsetting在子集后返回数据框中所有列的值
【发布时间】:2014-08-01 03:15:14
【问题描述】:

这是我几天前提出的题为“为 20 次重复和 2 次处理中的列的最小值设置数据框的子集”的问题的扩展,该问题涉及相同的数据集,但数据框略有不同。我的数据框df 有五列(朱利安日期、治疗、细胞、花朵、死亡)。有20个重复细胞接受2次处理,并在多个日期记录了花和死花。

例子df:

'juliandate' 'cell' 'treatment' 'flowers' 'dead'
260            1       1           5        0
265            1       1           8        2
270            1       1           1        5
260            1       2           1        0
265            1       2           10       2
270            1       2           0        8
260            2       1           3        0
265            2       1           9        5
270            2       1           2        12
260            2       2           2        1
265            2       2           6        2
270            2       2           3        6

我正在使用以下代码获取对应于 2 次处理中每个单元格的最大死花数量的朱利安日期,当多个日期对于给定的死花数量相同时,选择较晚的朱利安日期细胞和治疗

df[, list(dead=max(dead), julian=max(julian[dead==max(dead)])), by=list(cell.id, treat)]

返回:

'juliandate' 'cell' 'treatment' 'dead'
270           1       1            5
270           1       2            8
270           2       1            12
270           2       2            6

这将返回我正在寻找的内容,但我还想返回与这个新子集对应的花列中的值。

例如:

'juliandate' 'cell' 'treatment' 'flowers 'dead'
270           1       1             1      5
270           1       2             0      8
270           2       1             2      12
270           2       2             3      6

有没有一种很好的干净方法来做到这一点,而无需创建多个子集并将它们重新合并在一起?提前致谢。

【问题讨论】:

  • 您确定这是data.frame 而不是data.table?您使用的语法看起来不像可以与data.frame 一起使用的语法。它们是完全不同的对象。
  • 是的@MrFlick,你是对的。此示例使用data.table。我的错。感谢澄清
  • @user3874999。我以为您要求提供 data.table 解决方案。
  • 是的@akrun,我正在寻找一个 data.table 答案,因为这是我更熟悉的。但是,当我检查原始数据时,您的前两个产品返回的数字不正确。您的第三个建议似乎是正确的。我真的很感激帮助。我无法立即看出为什么您的前两个建议不起作用。
  • @user3874999,我看不出任何变体有什么问题。您是否在 this 示例数据上对其进行了测试?如果没有,您的数据集中是否有 NA?

标签: r


【解决方案1】:

dplyrdata.frames 和 data.tables 一起使用(至少对于某些操作,但它没有为所有现有的 data.table 操作提供一种替代品)所以在这种情况下它应该适用于您的数据不分类型:

library(dplyr)

df %>%     # data.frame or data.table 
  group_by(cell, treatment) %>%
  filter(dead == max(dead), juliandate == max(juliandate[dead==max(dead)]))

#Source: local data table [4 x 5]
#Groups: cell, treatment
#
#  juliandate cell treatment flowers dead
#1        270    1         1       1    5
#2        270    1         2       0    8
#3        270    2         1       2   12
#4        270    2         2       3    6

【讨论】:

    【解决方案2】:

    这里有一些使用data.table的变体:

    library(data.table)
    subset(df, df[, dead == max(dead) & 
                    juliandate == max(juliandate[dead == max(dead)]), 
    by=list(cell, treatment)]$V1)
    #    juliandate cell treatment flowers dead
    # 1:        270    1         1       1    5
    # 2:        270    1         2       0    8
    # 3:        270    2         1       2   12
    # 4:        270    2         2       3    6
    

    或者

    df[df[, dead == max(dead) &
            juliandate == max(juliandate[dead == max(dead)]), 
    by=list(cell, treatment)]$V1]
    

    或者

    df[, .SD[dead == max(dead) & 
             juliandate == max(juliandate[dead==max(dead)])], 
    by=list(cell, treatment)]
    

    此外,您可以在所有这些解决方案中使用临时变量,以避免为每个组执行两次== 矢量扫描,如下所示(此处仅显示一个变体):

    subset(df, df[, { tmp = dead == max(dead); 
                      tmp & juliandate == max(juliandate[tmp])
                    }, 
    by=list(cell, treatment)]$V1)
    

    【讨论】:

    • @Arun,谢谢。我无法正确获取 tmp 语法。能否请您编辑解决方案。
    • 感谢@akrun,感谢您的帮助。不过,只有第三种变体似乎返回了正确的值。我只是在学习,所以我不确定为什么会这样。
    猜你喜欢
    • 2014-09-07
    • 2019-02-04
    • 2021-06-27
    • 2023-02-20
    • 1970-01-01
    • 2023-03-17
    • 2012-06-08
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多