【问题标题】:Selecting rows in a specific pattern (R, Dataframe)以特定模式选择行(R,Dataframe)
【发布时间】:2020-01-17 09:18:18
【问题描述】:

我有一个(对大多数人来说)容易回答且非常基本的问题 - 可能。

想象一下有一个简单而普通的数据框,它有 20 行(在此示例中列无关紧要)。 有没有办法让我按照特定的选择模式获取所有行 数字方面的?例如:我想要前 3 行,跳过接下来的 5 行,然后在跳过的行之后获取以下 3 行 --> 在选择了 3 行之后,跳过接下来的 5 行,依此类推,直到数据帧结束到达。 --> 行和它们的特定列

基本上:RowsOfInterest、SkipThisAmountOfRows、RowsOfInterest、SkipThisAmountOfRows 例如:1:3、5、下一个 1:3(在 5 个跳过的之后)、5、1:3 等等。

我们将不胜感激 - 提前致谢!

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。

标签: r dataframe select rows


【解决方案1】:

您可以创建一个包含该模式的逻辑向量(例如 3 个 TRUE,然后 5 个 FALSE),然后该模式将在子集时自动回收(重复)您的 df 中的行数,因为这是一个逻辑向量。

df <- data.frame(rownum = 1:20, anothercol = letters[1:20])

df[rep(c(TRUE, FALSE), c(3, 5)),]
#    rownum anothercol
# 1       1          a
# 2       2          b
# 3       3          c
# 9       9          i
# 10     10          j
# 11     11          k
# 17     17          q
# 18     18          r
# 19     19          s

【讨论】:

  • 谢谢您,先生!感谢您的帮助 - 这正是我正在努力解决的问题!
【解决方案2】:

从模算术的角度来考虑这一点可能更容易。

您有一个每 8 行重复一次的模式,因此考虑行数模 8:

df[seq_len(nrow(df)) %% 8L %in% 1:3, ]

seq_len(nrow(df)) 创建一个向量 1, 2, 3, ..., nrow(df)

data.table 中,这可能会稍微干净一些:

df[1:.N %% 8L %in% 1:3]

这也更清楚地表明存在一些操作顺序问题——首先是%% 还是%in%?这是?Syntax:

在一个表达式中,相等优先级的运算符从左到右计算...

【讨论】:

    猜你喜欢
    • 2011-05-20
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2022-11-23
    相关资源
    最近更新 更多