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