我正在试图找出一种快速的方法来计算指定字符在数据帧列中按组出现的"第一次"次数.在这个例子中,我试图总结(求和)第一次的次数,对于每Period次,"X"的State出现,按ID分组.我正在寻找一种快速的方法来处理这一点,因为它是在数百万行的数据库上运行的.也许使用data.table包有一个很好的解决方案?

下面我说明了我试图实现的目标,并在底部发布了名为testDF的数据帧的代码.

enter image description here

代码:

testDF <-
  data.frame(
    ID = c(rep(10,5),rep(50,5),rep(60,5)),
    Period = c(1:5,1:5,1:5),
    State = c("A","B","X","X","X",
              "A","A","A","A","A",
              "A","X","A","X","B")
  )

推荐答案

也许我们可以先按‘ID’分组,然后创建列,然后按‘Period’和summarise分组

library(dplyr)
testDF %>% 
  group_by(ID) %>% 
  mutate(`1stStateX` = row_number() == which(State == "X")[1]) %>% 
  group_by(Period) %>%
  summarise(`1stStateX` = sum(`1stStateX`, na.rm = TRUE), .groups = 'drop')

-输出

# A tibble: 5 × 2
  Period `1stStateX`
   <int>       <int>
1      1           0
2      2           1
3      3           1
4      4           0
5      5           0

另一个选项是按ID分组后为slice,得到count并使用complete填充不可用的‘Period’

library(tidyr)
testDF %>% 
  group_by(ID) %>%
  slice(match('X', State)) %>%
  ungroup %>% 
  count(Period, sort = TRUE ,name = "1stStateX") %>% 
  complete(Period = unique(testDF$Period), 
    fill = list(`1stStateX` = 0))

-输出

# A tibble: 5 × 2
  Period `1stStateX`
   <int>       <int>
1      1           0
2      2           1
3      3           1
4      4           0
5      5           0

data.table中的类似选项

library(data.table)
setDT(testDF)[, `1stStateX` := .I == .I[State == 'X'][1], 
  ID][, .(`1stStateX` = sum(`1stStateX`, na.rm = TRUE)), by = Period]

-输出

 Period 1stStateX
    <int>     <int>
1:      1         0
2:      2         1
3:      3         1
4:      4         0
5:      5         0

R相关问答推荐

如何计算R数据集中每个女性的子元素数量?

在某些栏和某些条件下,替换dfs列表中的NA

二维样条,严格以一个参数递增

在df中保留原始变量和新变量

如何在R中描绘#符号?

Select 季度月值

从R中发出的咕噜声中的BUG?

在R中,如何从一系列具有索引名的变量快速创建数据帧?

在具有多个响应变量的比例堆叠条形图上方添加总计

为R中的16组参数生成10000个样本的有效方法是什么?

R基于变量组合创建新的指标列

是否有可能从边界中找到一个点值?

网络抓取新闻标题和时间

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

使用显式二元谓词子集化sfc对象时出错

在R中,有没有什么方法可以根据一列中的多个值来过滤行?

获取列位置

动态分组和计算分组依据

如何 suppress 条形图中的零条?

R直方图存储计算的bin值