【问题标题】:Group index from column labeling the last element in each group来自标记每个组中最后一个元素的列的组索引
【发布时间】:2016-01-09 21:27:14
【问题描述】:

我正在尝试对数据框进行子集化。数据框将被分成子集,其中每个子集中的最后一个元素在“bool”列中具有“TRUE”值。考虑以下数据框:

df <- data.frame(c(3,1,3,4,1,1,4), rnorm(7))
df <- cbind(df, df[,1] != 1)
names(df) <- c("ind", "var", "bool")
df
#   ind         var  bool
# 1   3  0.02343906  TRUE
# 2   1  0.94786193 FALSE
# 3   3  0.50632766  TRUE
# 4   4  0.24655548  TRUE
# 5   1 -1.58103304 FALSE
# 6   1  0.73999468 FALSE
# 7   4  0.10929906  TRUE

第 1 行应该是一个子集,第 2 行和第 3 行应该是一个子集,第 4 行是一个子集,然后第 5 到第 7 行是一个子集。我在下面的代码有效(我可以在新列上设置子集),但我想知道是否有更“R”的方式来做。

index = 1
for (i in 1:nrow(df))
 {
  if(df$bool[i])
   {df$index[i] = index
    index = index + 1
   }
  else
  {df$index[i] = index
  }
}
df
#   ind         var  bool index
# 1   3  0.02343906  TRUE     1
# 2   1  0.94786193 FALSE     2
# 3   3  0.50632766  TRUE     2
# 4   4  0.24655548  TRUE     3
# 5   1 -1.58103304 FALSE     4
# 6   1  0.73999468 FALSE     4
# 7   4  0.10929906  TRUE     4

【问题讨论】:

  • 为什么第 2 行和第 3 行的 bool 列是 FALSE TRUE 时的子集? 5 到 7 (F F T) 相同。
  • @RichardScriven bool 对每组中的最后一个元素为真
  • josilber 说了什么! - 但他们删除了它,我删除了我的,所以 - TRUE 代表一个组的结束。
  • 注意 :) 最终,我将通过新创建的列对这个数据框进行子集化,如果答案将框架拆分为没有新列的子集,我会接受这个答案!

标签: r


【解决方案1】:

我首先想到的是使用 bool 列上的累积总和 (cumsum) 来获取组索引——这将在每次 bool 值为时将索引值增加 1 TRUE:

df$index <- cumsum(df$bool)
df
#   ind        var  bool index
# 1   3 -1.0712125  TRUE     1
# 2   1  0.4994369 FALSE     1
# 3   3  2.1335274  TRUE     2
# 4   4 -1.5950432  TRUE     3
# 5   1  0.5919880 FALSE     3
# 6   1  2.7039831 FALSE     3
# 7   4 -1.3526646  TRUE     4

这不太对,因为每个组的TRUE 之前的所有观察都分配给了前一组。我们可以通过将bool 设置为FALSE 的所有观察值加1 来解决这个问题:

df$index <- cumsum(df$bool) + !df$bool
df
#   ind        var  bool index
# 1   3 -1.0712125  TRUE     1
# 2   1  0.4994369 FALSE     2
# 3   3  2.1335274  TRUE     2
# 4   4 -1.5950432  TRUE     3
# 5   1  0.5919880 FALSE     4
# 6   1  2.7039831 FALSE     4
# 7   4 -1.3526646  TRUE     4

现在可以使用subsets &lt;- split(df, df$index) 高效地将数据框拆分为子集列表。

【讨论】:

    猜你喜欢
    • 2016-07-14
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多