创建一个新变量,用于计算R中重复项的长度
我有一个数据帧,我想创建一个变量z,计算“y变量”的重复数,如果y有1,1集z=2,2,如果y有3,3,3,集z=3,3,3创建一个新变量,用于计算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
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
是z331232
或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