首页 > 解决方案 > 如果满足条件,则复制一系列值

问题描述

我试图在下面的示例数据框中添加一列(事务),其中的逻辑是对于索引列中的每个“新值”,值的复制将重新开始。索引中的值将在整个数据框(150,000+ 行)中随机标记为“新”。我希望第一行以 1 开头,并且在每个 1:3 序列之后,序列将在 3 之后从 1 重新开始,除非索引列中有“新”,其中序列自动从 1 重新开始. 我尝试过利用rep()ifelse各种组合,但收效甚微。此外,Transaction 列当前为空,没有任何值。先感谢您!

指数 交易
1
2
3
1
2
3
新的 1
2
新的 1
2
3
1
新的 1
2

标签: rrep

解决方案


这是第一次尝试:

library(tidyverse)

# Creating the data frame: 
df <- data.frame(index = rep("", 14))
df[c(7,9,13), 'index'] <- 'New'


# Defining a run index:
df$run <- cumsum(df$index == "New")


df %>% 
  group_by(run) %>% 
  mutate(Transaction = ifelse( (1:n())%%3==0, 3, 1:n()%%3  )) %>%
  ungroup() %>% select(-run)

  # A tibble: 14 x 2
   index Transaction
   <chr>       <dbl>
 1 ""              1
 2 ""              2
 3 ""              3
 4 ""              1
 5 ""              2
 6 ""              3
 7 "New"           1
 8 ""              2
 9 "New"           1
10 ""              2
11 ""              3
12 ""              1
13 "New"           1
14 ""              2

推荐阅读