R 如何将data.table与循环组合

R 如何将data.table与循环组合,r,data.table,R,Data.table,我的数据框如下所示: > data <- data.frame(A=c(1,1,1,2,2,3,3,3,3,3), B=c("1A","1B","1C","2A","2B","3A","3B","3C","3D","3E")) 我尝试使用data.table函数。我尝试的代码是: > setDT(data) > data <- data[,list(LABEL = for(i in 1:length(A)){paste(i, "-", i+1, sep="")})

我的数据框如下所示:

> data <- data.frame(A=c(1,1,1,2,2,3,3,3,3,3), B=c("1A","1B","1C","2A","2B","3A","3B","3C","3D","3E"))
我尝试使用data.table函数。我尝试的代码是:

> setDT(data)
> data <- data[,list(LABEL = for(i in 1:length(A)){paste(i, "-", i+1, sep="")}),by=c("A","B")]   
>setDT(数据)

>数据我们可以使用
shift
在按“A”分组后创建序列的“lead”值,并
将其粘贴到行序列中以创建“LABEL”

library(data.table)
setDT(data)[, LABEL := paste(seq_len(.N), shift(seq_len(.N),
                          type='lead', fill= .N+1), sep="-"), by = A]


或者我们可以使用
base R
方法

i1 <- sequence(tabulate(data$A))
data$LABEL <- paste(i1, i1+1, sep="-")
data$LABEL
#[1] "1-2" "2-3" "3-4" "1-2" "2-3" "1-2" "2-3" "3-4" "4-5" "5-6"

i1您还可以使用dplyr::mutate

library(dplyr)
data %>% 
        group_by(A) %>% 
        mutate(LABEL=paste(seq_along(A),seq_along(A)+1,sep="-"))
在这里,您按A分组,沿组查找序列并连接序列+1

Source: local data frame [10 x 3]
Groups: A [3]

       A      B LABEL
   <dbl> <fctr> <chr>
1      1     1A   1-2
2      1     1B   2-3
3      1     1C   3-4
4      2     2A   1-2
5      2     2B   2-3
6      3     3A   1-2
7      3     3B   2-3
8      3     3C   3-4
9      3     3D   4-5
10     3     3E   5-6
来源:本地数据帧[10 x 3]
分组:A[3]
标签
1 1A 1-2
2 1 B 2-3
3 1 1C 3-4
4 2 2A 1-2
5 2 2B 2-3
6 3 3A 1-2
7 3 b 2-3
8 3 3C 3-4
9 3 3D 4-5
10 3 E 5-6

另一个选项是使用
base R
ave
功能

data$LABEL <- ave(data$A, data$A, FUN = function(x) 
                                      paste0(seq_along(x), "-", seq_along(x)+1))
data
#   A  B LABEL 
#1  1 1A   1-2
#2  1 1B   2-3
#3  1 1C   3-4
#4  2 2A   1-2
#5  2 2B   2-3
#6  3 3A   1-2
#7  3 3B   2-3
#8  3 3C   3-4
#9  3 3D   4-5
#10 3 3E   5-6
data$LABEL
Source: local data frame [10 x 3]
Groups: A [3]

       A      B LABEL
   <dbl> <fctr> <chr>
1      1     1A   1-2
2      1     1B   2-3
3      1     1C   3-4
4      2     2A   1-2
5      2     2B   2-3
6      3     3A   1-2
7      3     3B   2-3
8      3     3C   3-4
9      3     3D   4-5
10     3     3E   5-6
data$LABEL <- ave(data$A, data$A, FUN = function(x) 
                                      paste0(seq_along(x), "-", seq_along(x)+1))
data
#   A  B LABEL 
#1  1 1A   1-2
#2  1 1B   2-3
#3  1 1C   3-4
#4  2 2A   1-2
#5  2 2B   2-3
#6  3 3A   1-2
#7  3 3B   2-3
#8  3 3C   3-4
#9  3 3D   4-5
#10 3 3E   5-6