R通过从零开始的id在dplyr中创建序列
R create sequence in dplyr by id beginning with zero
我正在寻找最简洁的方法来在数据帧中通过 id 创建一个从零开始的序列。
df <- data.frame (id=rep(1:10,each=10))
如果我想从 1 开始序列,可以执行以下操作:
library(dplyr)
df<-df %>% group_by(id) %>%
mutate(start = 1:n()) %>%
ungroup()
但是从 0 开始不起作用,因为它创建了一个额外的数字(0-10 与 1-10 相比)所以我需要添加一个额外的行,有没有办法一步完成所有这些,也许使用 dplyr
?显然有许多解决方法,例如创建另一个数据集并将其附加到原始数据集。
df1 <- data.frame (id=1:10,
start=0)
new<-rbind(df,df1)
这看起来有点尴尬而且不太整洁。我知道您可以在 dplyr 中使用 rbind 但不确定如何将所有内容合并到一个步骤中,特别是如果您有其他非时序变量,您只想复制到新行中。有兴趣看到建议,谢谢。
您可以使用 tidyverse
中的 complete()
:
library(tidyverse)
df %>%
group_by(id) %>%
mutate(start = 1:n()) %>%
complete(start = c(0:10)) %>%
ungroup()
产生
# A tibble: 110 x 2
id start
<int> <int>
1 1 0
2 1 1
3 1 2
4 1 3
5 1 4
6 1 5
7 1 6
8 1 7
9 1 8
10 1 9
# ... with 100 more rows
我正在寻找最简洁的方法来在数据帧中通过 id 创建一个从零开始的序列。
df <- data.frame (id=rep(1:10,each=10))
如果我想从 1 开始序列,可以执行以下操作:
library(dplyr)
df<-df %>% group_by(id) %>%
mutate(start = 1:n()) %>%
ungroup()
但是从 0 开始不起作用,因为它创建了一个额外的数字(0-10 与 1-10 相比)所以我需要添加一个额外的行,有没有办法一步完成所有这些,也许使用 dplyr
?显然有许多解决方法,例如创建另一个数据集并将其附加到原始数据集。
df1 <- data.frame (id=1:10,
start=0)
new<-rbind(df,df1)
这看起来有点尴尬而且不太整洁。我知道您可以在 dplyr 中使用 rbind 但不确定如何将所有内容合并到一个步骤中,特别是如果您有其他非时序变量,您只想复制到新行中。有兴趣看到建议,谢谢。
您可以使用 tidyverse
中的 complete()
:
library(tidyverse)
df %>%
group_by(id) %>%
mutate(start = 1:n()) %>%
complete(start = c(0:10)) %>%
ungroup()
产生
# A tibble: 110 x 2
id start
<int> <int>
1 1 0
2 1 1
3 1 2
4 1 3
5 1 4
6 1 5
7 1 6
8 1 7
9 1 8
10 1 9
# ... with 100 more rows