基于给定列的行求和,对数据框进行子集筛选。

3
我正在处理包含三个变量(即id,时间,性别)的数据。它看起来像这样:
df <-
  structure(
    list(
      id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L),
      time = c(21L, 3L, 4L, 9L, 5L, 9L, 10L, 6L, 27L, 3L, 4L, 10L),
      gender = c(1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L)
    ),
    .Names = c("id", "time", "gender"),
    class = "data.frame",
    row.names = c(NA,-12L)
  )

也就是说,每个id都有关于时间和性别的4个观察值。我想在R中根据变量time的行求和来对这些数据进行子集操作,首先对于每个id找到第一个大于等于25的值。注意,对于id 2,所有观察值都将被包含在内,而对于id 3,只涉及第一个观察值。期望的结果如下:
df <-
  structure(
    list(
      id = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L ),
      time = c(21L, 3L, 4L, 5L, 9L, 10L, 6L, 27L ),
      gender = c(1L, 1L, 1L, 0L, 0L, 0L, 0L, 1L)
    ),
    .Names = c("id", "time", "gender"),
    class = "data.frame",
    row.names = c(NA,-8L)
  )

任何相关的帮助都将不胜感激。

我非常感谢您提供创建data.frame和期望结果的代码。问题表述得非常清晰明了。 - MKR
3个回答

2

一种选项是使用 cumsum lag

library(dplyr)

df %>% group_by(id,gender) %>%
  filter(lag(cumsum(time), default = 0) < 25 )

# # A tibble: 8 x 3
# # Groups: id, gender [3]
# id  time gender
# <int> <int>  <int>
# 1     1    21      1
# 2     1     3      1
# 3     1     4      1
# 4     2     5      0
# 5     2     9      0
# 6     2    10      0
# 7     2     6      0
# 8     3    27      1

使用 data.table :(根据 @Renu 的反馈更新)
library(data.table)

setDT(df)

df[,.SD[shift(cumsum(time), fill = 0) < 25], by=.(id,gender)]

1
可以尝试使用dplyr构建:
dt <- groupby(df, id) %>%
#sum time within  groups
mutate(sum_time = cumsum(time))%>% 
#'select' rows, which fulfill the condition
filter(sum_time < 25) %>% 
#exclude sum_time column from the result
select (-sum_time)

1
另一种选择是为每个'id'创建一个逻辑向量,即cumsum(time) >= 25,当'time'的cumsum等于或大于25时,该向量为TRUE

然后,您可以筛选累积和向量的行,使其小于或等于1,即为每个'id'的第一个TRUE之前的条目进行筛选。
df %>% 
 group_by(id) %>% 
 filter(cumsum( cumsum(time) >= 25 ) <= 1)
# A tibble: 8 x 3
# Groups:   id [3]
#      id  time gender
#   <int> <int>  <int>
# 1     1    21      1
# 2     1     3      1
# 3     1     4      1
# 4     2     5      0
# 5     2     9      0
# 6     2    10      0
# 7     2     6      0
# 8     3    27      1

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