AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76920154
Accepted
mto23
mto23
Asked: 2023-08-17 17:25:49 +0800 CST2023-08-17 17:25:49 +0800 CST 2023-08-17 17:25:49 +0800 CST

选择每组连续 1 的行

  • 772

我有一个数据帧,我想通过仅选择连续值“1”来对其进行子集化。

具体来说,我有一个如下所示的数据框:

library(tidyverse)
library(zoo)

df <- data.frame(matrix(ncol = 3, nrow = 17))
colnames(df) <- c("row_id","id", "k_yes")
df$row_id <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17)
df$id <- c("1_1","1_1","1_1","1_1","1_1","1_1","1_2","1_2","1_2","1_2","1_2","1_2","1_3","1_3","1_3","1_3","1_3")
df$k_yes <- c(1,1,1,0,1,1,0,0,0,1,1,0,1,0,1,0,1)
df
   row_id    id  k_yes
1       1   1_1      1
2       2   1_1      1
3       3   1_1      1
4       4   1_1      0
5       5   1_1      1
6       6   1_1      1
7       7   1_2      0
8       8   1_2      0
9       9   1_2      0
10     10   1_2      1
11     11   1_2      1
12     12   1_2      0
13     13   1_3      1
14     14   1_3      0 
15     15   1_3      1
16     16   1_3      0
17     17   1_3      1

我想创建两个数据集:

1)每组 ( id) 中只有“1”,但始终有两个或多个连续的。所以,如果两个“1”之间有一个“0”,至少最后一个“1”应该被丢弃。所以它会接受像eg 1-1,,1-1-1等等的序列,但不接受0-1-1or1-1-1-0

然后,我还想添加一列来了解已形成哪个新组/序列,因为它并不总是与 id 相同(如果 id 中有两个子组/序列)。基本上,该列对于整个数据帧的每个序列应该有一个唯一的代码(现在,我只是将 id 与一个字母绑定,但它可以是连续的数字/字母,例如)

这个数据框看起来像这样:

  row_id    id k_yes  new_group
1      1   1_1     1      1_1_A
2      2   1_1     1      1_1_A
3      3   1_1     1      1_1_A
4      5   1_1     1      1_1_B
5      6   1_1     1      1_1_B
6     10   1_2     1      1_2_A
7     11   1_2     1      1_2_A

2)另一种,每组 ( id) 接受“1”之间有一个“0”,但如果“0”之后没有其他“1”,则不接受。所以它会接受像eg 、、、、1-0-1等等这样的序列,但不接受像or或或这样的序列(在后面,它只会保留前一个1)。与之前的“new_group”列相同。1-1-0-11-1-0-1-11-1-0-1-0-10-1-11-1-01-1-0-0-1

df 所需的输出为:

   row_id    id k_yes  new_group
1       1   1_1     1      1_1_A
2       2   1_1     1      1_1_A
3       3   1_1     1      1_1_A
4       4   1_1     0      1_1_A
5       5   1_1     1      1_1_A
6       6   1_1     1      1_1_A
7      10   1_2     1      1_2_A
8      11   1_2     1      1_2_A
9      12   1_3     1      1_3_A
10     14   1_3     0      1_3_A
11     15   1_3     1      1_3_A
12     16   1_3     0      1_3_A
13     17   1_3     1      1_3_A

在本例中,id“1_1”仅获得“新组”(1_1_A) 的一个值,因为它都是相同的序列(包括 0)

我尝试遵循这个答案,但没有成功,因为我尝试过:

> df |>
     group_by(id) |> 
     mutate(b = c(first(k_yes) , zoo::rollsum(k_yes, 1))) |>
     summarise(groups_to_keep = id[which(b >= 2)]) -> gk

Error in `mutate()`:
ℹ In argument: `b = c(first(k_yes), zoo::rollsum(k_yes, 1))`.
ℹ In group 1: `id = "1_1"`.
Caused by error:
! `b` must be size 5 or 1, not 6.

我认为问题出在rollsum()函数上,但是在检查了帮助页面后,我仍然不清楚应该如何应用这个函数。

任何帮助表示赞赏!

更新:

我添加了数据集的新版本,它将在第一个数据集 (1) 中为“新组”创建两个值。

  • 1 1 个回答
  • 49 Views

1 个回答

  • Voted
  1. Best Answer
    2023-08-17T17:55:42+08:002023-08-17T17:55:42+08:00

    对于数据集#1:

    df |>
      filter(k_yes & (lag(k_yes) | lead(k_yes)), .by = id) |>
      mutate(new_group = row_number() == 1 | row_id - 1 != lag(row_id), .by = id) |>
      mutate(new_group = paste0(id, "_", LETTERS[cumsum(new_group)]), .by = id)
    

    数据集2:

    df |>
      filter(k_yes | (!k_yes & lag(k_yes) & lead(k_yes)), .by = id) |> 
      mutate(new_group = row_number() == 1 | row_id - 1 != lag(row_id), .by = id) |>
      mutate(new_group = paste0(id, "_", LETTERS[cumsum(new_group)]), .by = id)
    
    • 1

相关问题

  • 图形 API 调用列表 subscribedSkus 状态权限不足,但已授予权限

  • 根据列值创建单独的 DF 的函数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve