如果满足条件,则复制一系列值
Replicate a range of values if condition is satisfied
我正在尝试向下面的示例数据框添加一列(事务),其中的逻辑是对于索引列中的每个“新值”,值的复制将重新开始。索引中的值将在整个数据帧(150,000 多行)中随机标记为“新”。我希望第一行以 1 开头,并且在每个 1:3 序列之后,序列将在 3 之后的 1 处重新开始,除非索引列中有“New”,其中序列会自动重新开始在 1. 我曾尝试以各种组合方式使用 rep()
和 ifelse
,但收效甚微。此外,交易列当前为空,没有任何值。提前致谢!
索引
交易
1
2
3
1
2
3
新
1
2
新
1
2
3
1
新
1
2
这是第一次尝试:
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
我正在尝试向下面的示例数据框添加一列(事务),其中的逻辑是对于索引列中的每个“新值”,值的复制将重新开始。索引中的值将在整个数据帧(150,000 多行)中随机标记为“新”。我希望第一行以 1 开头,并且在每个 1:3 序列之后,序列将在 3 之后的 1 处重新开始,除非索引列中有“New”,其中序列会自动重新开始在 1. 我曾尝试以各种组合方式使用 rep()
和 ifelse
,但收效甚微。此外,交易列当前为空,没有任何值。提前致谢!
索引 | 交易 |
---|---|
1 | |
2 | |
3 | |
1 | |
2 | |
3 | |
新 | 1 |
2 | |
新 | 1 |
2 | |
3 | |
1 | |
新 | 1 |
2 |
这是第一次尝试:
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