创建一个新变量,用于计算R中重复项的长度

创建一个新变量,用于计算R中重复项的长度,r,count,duplicates,aggregate,R,Count,Duplicates,Aggregate,我有一个数据帧,我想创建一个变量z,计算“y变量”的重复数,如果y有1,1集z=2,2,如果y有3,3,3,集z=3,3,3 x = c("a","b","c","d","e","a","b","c","d","e","a","b","c") y = c(1,1,2,2,2,3,3,4,4,4,5,5,5) data <- data.frame(x,y) data x y z 1 a 1 2 2 b 1 2 3 c 2 3 4 d 2 3 5 e 2 3

我有一个数据帧,我想创建一个变量z,计算“y变量”的重复数,如果y有1,1集z=2,2,如果y有3,3,3,集z=3,3,3

 x = c("a","b","c","d","e","a","b","c","d","e","a","b","c")
 y = c(1,1,2,2,2,3,3,4,4,4,5,5,5)
 data <- data.frame(x,y)
 data
    x y z
 1  a 1 2
 2  b 1 2
 3  c 2 3
 4  d 2 3
 5  e 2 3
 6  a 3 2
 7  b 3 2
 8  c 4 3
 9  d 4 3
 10 e 4 3
 11 a 5 3
 12 b 5 3
 13 c 5 3
x=c(“a”、“b”、“c”、“d”、“e”、“a”、“b”、“c”、“d”、“e”、“a”、“b”、“b”、“c”)
y=c(1,1,2,2,3,3,4,4,4,5,5)

数据您可以尝试
rle

data$z <- with(data, unlist(mapply(rep, rle(y)$lengths, rle(y)$lengths)))
data
   x y z
1  a 1 2
2  b 1 2
3  c 2 3
4  d 2 3
5  e 2 3
6  a 3 2
7  b 3 2
8  c 4 3
9  d 4 3
10 e 4 3
11 a 5 3
12 b 5 3
13 c 5 3

data$z如果变量y按您所说的递增顺序排序,则以下解决方案将起作用:

# calculate counts of each level
counts <- table(data$y)
# fill in z
data$z <- counts[match(data$y, names(counts))]
#计算每个级别的计数

counts这里有一个使用dplyr的快速方法,以及它相当直观的语法:

library(dplyr)

left_join(data, data %>%
                group_by(y) %>%
                summarize(z = n()), 
          by = "y")

   x y z
1  a 1 2
2  b 1 2
3  c 2 3
4  d 2 3
5  e 2 3
6  a 3 2
7  b 3 2
8  c 4 3
9  d 4 3
10 e 4 3
11 a 5 3
12 b 5 3
13 c 5 3

我们可以通过
data.table

library(data.table)
setDT(data)[, z := .N , rleid(y)]
data
#    x y z
# 1: a 1 2
# 2: b 1 2
# 3: c 2 3
# 4: d 2 3
# 5: e 2 3
# 6: a 3 2
# 7: b 3 2
# 8: c 4 3
# 9: d 4 3
#10: e 4 3
#11: a 5 3
#12: b 5 3
#13: c 5 3

或者使用
baser
中的
rle
而不使用任何
循环

inverse.rle(within.list(rle(data$y), values <- lengths))
#[1] 2 2 3 3 3 2 2 3 3 3 3 3 3

如果y是
12313
是z
331232
212122
?如果y是1233,z将是12312,但y是唯一的,所以它不是随机的,y是递增的数字y变量y=c的序列(1,1,2,2,3,3,4,4,5,5,6,7,7,8,8,9,9,10,11),你认为哪一部分不正确?请注意,您将数据切割为30,因此最后一个
11,11
不能真正计数,之后可能会有另一个11。
with(data, ave(y, cumsum(c(TRUE, y[-1]!= y[-length(y)])), FUN=length))
#[1] 2 2 3 3 3 2 2 3 3 3 3 3 3