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

11

如何选择符合特定条件的 R 数据框中的第一行?

这是背景:

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

"pixel", "year","propvar", "component", "cumsum." 
有1,225种像素和年份的组合,因为数据是从每个25个研究年份中的49个地理像素的年度时间序列计算出来的。在每个像素年份内,我计算了propvar,即给定像素年份时间序列的快速傅里叶变换的一个分量所解释的总方差的比例。然后我计算了cumsum,它是像素年份内每个频率分量propvar的累积和。 component列只是为您提供了傅里叶级数分量的索引(加1),其中propvar是由其计算出来的。
我想确定需要解释大于99%方差的分量数。我想到的一种方法是找到每个像素年份内的第一行,其中cumsum > 0.99,然后用三列(pixel,year和numbercomps)从中创建一个数据帧,其中numbercomps是给定像素年份内解释大于99%方差所需的分量数。我不知道如何在R中实现这一点。有人有解决方法吗?
2个回答

19

没问题。像这样做应该可以解决问题:

# 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)]

4
天啊,现在我知道你为什么在 StackOverflow 的会员期只有 43 天,却已经积累了 2,157 分了。谢谢,老兄!我将把这份回复保存在我的邮件客户端的 StackOverflow 文件夹中。如果这次帮助最终产生了出版物,我会在其中承认你的贡献。顺便说一句,我非常喜欢那个函数的副本。就像……恰好是我需要的东西。(顺便说一句,这些出版物当然需要比这个问题的解决更多的工作,哈哈。)晚安。 - Brash Equilibrium
好的。请将项目的任何出版物副本发送给我(当然不需要致谢)! - Josh O'Brien
好的!我已经检查了你的答案。再次感谢。 - Brash Equilibrium
@PaulHiemstra--没错。感谢你把我带回这里,因为这一定是我在SO上看到的最有趣的评论之一。当时让我微笑,现在也让我微笑。(Brash--别忘了在你完成出版物/手稿后给我发一份!) - Josh O'Brien
也许你可以把它发送给我们所有人,你已经引起了我的兴趣 :) - Paul Hiemstra
@JoshO'Brien(和Paul Hiemstra)伙计们,我们最终的测量模型中没有采用傅里叶变换,但还是感谢你的帮助,Josh。 - Brash Equilibrium

0

假设df是数据集,我们需要选择符合条件的第一行。

这两行代码将返回所需的行。

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

df_required <- df[row_index,]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接