【问题标题】:Compute counting variable in dataframe计算数据框中的计数变量
【发布时间】:2012-10-29 09:26:39
【问题描述】:

我有一个 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

我想创建一个新列,每次“list”的值发生变化时从 1 开始计数,即在本例中:

b <- c(1:3,1:4,1:3,1:2)    
data <- data.frame(a,list,b)  

我远不是 R 方面的专家,而且我终其一生都无法找到一种有效的方法来做到这一点。我的主要问题似乎是 “list”的任何值都可以随时返回,但是对于一个值的块的长度没有规定。 有没有人有任何想法? 谢谢!

【问题讨论】:

  • 只是一个评论:最好不要使用内置名称(如datalist)作为变量名 - 如果稍后您想使用list() 函数,你可能会遇到非常奇怪的错误。
  • 事实上,大多数人都会避免称他们的狗为“狗”!例如。
  • 是的,你是对的。从现在开始,我会牢记这一点。

标签: r


【解决方案1】:

我会使用rle() 来获取list 的运行长度,然后使用方便的sequence() 函数从$lengthsrle() 返回的组件生成所需的计数器:

R> sequence(rle(as.character(data$list))$lengths)
 [1] 1 2 3 1 2 3 4 1 2 3 1 2

请注意,我们必须将 list 转换为原子向量(在我的情况下为字符向量),因为 rle() 中不允许使用一个因子。

要将其放入data,然后将其包装在诸如

之类的调用中
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

【讨论】:

  • @user1777393 如果您对答案感到满意,请考虑接受其中一个。使用您希望接受的答案旁边的大勾号。 Stack Overflow 常见问题解答的 How to Ask 部分解释了如何执行此操作以及这样做有帮助/有用的原因。
【解决方案2】:

关键思想是在data$list 上使用rle()(运行长度编码)(在将其强制为原子向量之后——毕竟,我们对特定条目不感兴趣)。然后我们使用seq() 创建从 1 开始到计算出的运行长度结束的序列。最后,我们将所有这些序列粘贴在一起:

unlist(lapply(rle(as.numeric(data$list))$lengths,FUN=seq,from=1))

【讨论】:

  • 谢谢!!这正是我所需要的。我不知道那个功能,所以你让我很高兴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多