【问题标题】:How do I select the first row in an R data frame that meets certain criteria?如何选择满足特定条件的 R 数据框中的第一行?
【发布时间】:2011-11-16 01:49:54
【问题描述】:

如何选择满足特定条件的 R 数据框的第一行?

这里是上下文:

我有一个包含五列的数据框:

"pixel", "year","propvar", "component", "cumsum." 

pixelyear 有 1,225 种组合,因为数据是根据 25 个研究年份中每年 49 个地理像素的年度时间序列计算得出的。在每个像素年中,我计算了propvar,即由给定像素年时间序列的快速傅里叶变换的给定分量解释的总方差的比例。然后我计算了cumsum,它是像素年内每个频率分量的propvar 的累积和。 component 列只为您提供计算 propvar 的傅里叶级数分量(加 1)的索引。

我想确定解释大于 99% 的方差所需的分量数。我认为一种方法是找到每个像素年中cumsum > 0.99 的第一行,并从中创建一个包含三列pixelyearnumbercomps 的数据框,其中numbercomps 是在给定像素年内解释大于 99% 的方差所需的分量数。我不知道如何在 R 中执行此操作。有人有解决方案吗?

【问题讨论】:

    标签: r select dataframe


    【解决方案1】:

    当然。像这样的东西应该可以解决问题:

    # CREATE A REPRODUCIBLE EXAMPLE!
    df <- data.frame(year = c("2001", "2003", "2001", "2003", "2003"),
                     pixel = c("a", "b", "a", "b", "a"), 
                     cumsum = c(99, 99, 98, 99, 99),
                     numbercomps=1:5)
    df
    #   year pixel cumsum numbercomps
    # 1 2001     a     99           1
    # 2 2003     b     99           2 
    # 3 2001     a     98           3
    # 4 2003     b     99           4
    # 5 2003     a     99           5
    
    # EXTRACT THE SUBSET YOU'D LIKE.
    res <- subset(df, cumsum>=99)
    res <- subset(res, 
                  subset = !duplicated(res[c("year", "pixel")]),
                  select = c("pixel", "year", "numbercomps"))
    #   pixel year numbercomps
    # 1     a 2001           1
    # 2     b 2003           2
    # 5     a 2003           5
    

    编辑另外,对于那些对data.table 感兴趣的人,这里有:

    library(data.table)
    dt <- data.table(df, key="pixel, year")    
    dt[cumsum>=99, .SD[1], by=key(dt)]
    

    【讨论】:

    • 天哪。现在我知道为什么您在 StackOverflow 会员资格仅 43 天就获得了 2,157 分。谢啦!我的电子邮件客户端的 StackOverflow 文件夹中有此回复。我会在任何出版物中感谢您的帮助。我喜欢重复的功能,顺便说一句。就像……正是我需要的。 (顺便说一句,这些出版物当然会比这个特定问题更多的工作产生,哈哈。)祝你晚安。
    • 酷。一定要给我一份该项目的任何 pub 的副本(当然不需要确认)!
    • 会的!我已经检查了你的答案。再次感谢。
    • @PaulHiemstra -- 马上。谢谢你把我带回这里,因为那一定是我在 SO 上见过的最有趣的 cmets 之一。那时让我微笑;现在让我微笑。 (还有 Brash —— 收到后别忘了把出版物/手稿发给我!)
    • 也许把它发给我们所有人,你让我感兴趣:)
    【解决方案2】:

    假设 df 是我们必须从中选择符合条件的第一行的数据集。 这个两行代码将为您提供所需的行。

    row_index <- which(<criteria>, arr.ind = TRUE)[1]
    
    df_required <- df[row_index,]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      相关资源
      最近更新 更多