我有一个数据框,其中的 Select 是在会话中按顺序进行的.我想创建一个变量,指示每个选项的订单号.问题是,我只知道每次会议的第一 Select 是什么,我想知道每个 Select 的顺序.

假设我们有一个 Select ,一个信号告诉我们这是否是会话中的第一个 Select .假设数据是有序的.我想得到的是第三列(顺序),指示 Select 顺序,所以每次我们有一个1,顺序是1,它正在上升(2,3,…)直到下一个1.

df = data.frame(
  choice = c('a','a','b','e','a','l','d','a'),
  signal = c(1,0,0,1,0,0,0,0),
  order = c(1,2,3,1,2,3,4,5))

  choice signal order
1      a      1     1
2      a      0     2
3      b      0     3
4      e      1     1
5      a      0     2
6      l      0     3
7      d      0     4
8      a      0     5

所以我试着用map来解决这个问题,但由于一个明显的原因,它不起作用:我不知道如何更新 map 之外的向量.

my_order = df$signal
map(
  .x = seq(1,(df$signal %>% length())),
  .f = function(x) {
    my_order[x] = ifelse(my_order[x]==1, my_order[x], my_order[x-1]+1)
    my_order})

你知道我怎么用 map 来做吗?还有别的吗?我试图为我自己避免.

推荐答案

您可以使用ave并从cumsum(signal == 1)定义的组中创建序列seq_along(或者仅cumsum(signal),因为它只有0-1个值;正如@philliptomk所指出的).

df$order <- with(df, ave(signal, cumsum(signal == 1), FUN = seq_along))

df
#   choice signal order
# 1      a      1     1
# 2      a      0     2
# 3      b      0     3
# 4      e      1     1
# 5      a      0     2
# 6      l      0     3
# 7      d      0     4
# 8      a      0     5

或者使用dplyr中的group_byrow_number:

library(dplyr)
df %>% 
  group_by(gp = cumsum(signal == 1)) %>% 
  mutate(order = row_number())

或者使用data.table::rowid:

data.table::rowid(cumsum(df$signal == 1))

R相关问答推荐

如何创建构成多个独立列条目列表的收件箱框列?

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

r—绘制相交曲线

使用R闪光显示所有数据点作为默认设置

以相同的方式对每个表进行排序

SHINY:使用JS函数应用的CSS样式显示HTML表格

用R ggplot2求上、下三角形中两个变量的矩阵热图

过滤名称以特定字符串开头的文件

`夹心::vcovCL`不等于`AER::tobit`标准错误

悬崖三角洲超大型群数计算导致整数溢出

汇总数据帧中的复制列,保持行的唯一性

按组计算列中1出现的间隔年数

警告消息";没有非缺失的参数到min;,正在返回数据中的inf";.表分组集

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

从线的交点创建面

如何在R中创建这些列?

在不带max()的data.table中按组查找最后一个元素

我有2011-2022年的年度数据.如何计算最低年份和最高年份之间的差额?

真实世界坐标的逆st_变换

如何将数据框压缩为更宽,同时将行输入保持为行输入,而不是R中的列名?