R 计算数据帧中的计数变量
我有一个R数据帧:R 计算数据帧中的计数变量,r,R,我有一个R数据帧: a <- 1:12 list <- c(rep("x",3),rep("y",4),rep("z",3),rep("x",2)) data <- data.frame(a,list) data a list 1 x 2 x 3 x 4 y 5 y 6 y 7 y 8 z 9 z 10 z 11 x 12 x
a <- 1:12
list <- c(rep("x",3),rep("y",4),rep("z",3),rep("x",2))
data <- data.frame(a,list)
data
a list
1 x
2 x
3 x
4 y
5 y
6 y
7 y
8 z
9 z
10 z
11 x
12 x
a关键思想是在数据$list
上使用rle()
(运行长度编码)(将其强制为原子向量后-毕竟,我们对特定条目不感兴趣)。然后我们使用seq()
创建从1开始到计算的运行长度结束的序列。最后,我们将所有这些序列粘贴在一起:
unlist(lapply(rle(as.numeric(data$list))$lengths,FUN=seq,from=1))
我将使用rle()
获取list
的运行长度,然后使用方便的sequence()
函数从rle()
返回的$length
组件生成所需的计数器:
注意,我们必须将list
转换为原子向量(在我的例子中是字符向量),因为rle()
中不允许使用因子
要将其放入数据中
,请将其包装在调用中,例如
data <- transform(data, b = sequence(rle(as.character(list))$lengths))
数据
a名单b
1 x 1
2 x 2
3 x 3
4 y 1
5年2月
6年3月
7 y 4
8Z1
9Z2
10 10 z 3
11 x 1
12 x 2
只是一个注释:最好不要使用内置名称(如数据或列表)作为变量名-如果以后要使用列表()
函数,您可能会遇到非常奇怪的错误。事实上,大多数人都会避免称他们的狗为“狗”!例如,是的,你是对的。从现在起我会记住的。谢谢!!这正是我需要的。我不知道那个函数,所以你让我很高兴。@ USE1717339如果你对答案满意,请考虑接受其中一个。在你想接受的答案旁边用大勾号。常见问题解答部分解释了如何做到这一点以及为什么这样做很有用。
R> sequence(rle(as.character(data$list))$lengths)
[1] 1 2 3 1 2 3 4 1 2 3 1 2
data <- transform(data, b = sequence(rle(as.character(list))$lengths))
R> data <- transform(data, b = sequence(rle(as.character(list))$lengths))
R> data
a list b
1 1 x 1
2 2 x 2
3 3 x 3
4 4 y 1
5 5 y 2
6 6 y 3
7 7 y 4
8 8 z 1
9 9 z 2
10 10 z 3
11 11 x 1
12 12 x 2