Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算数据帧中的计数变量_R - Fatal编程技术网

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

我有一个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关键思想是在
数据$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