1

我有以下测试数据框。

id1 val
A 1  
A 1  
A 1  
A 1  
B 2  
B 2  
B 2  
B 2  

我想将其转换为如下所示的数据框。

id1 val
A 1  
A 1  
A 2  
A 2  
B 3  
B 3  
B 4  
B 4  

我所做的是首先找到 A & B 发生次数的计数,在这种情况下 = 4,将其拆分为 2,然后更新第二列,使其相应地递增。所以四个 1 变成了 1,2,四个 2 变成了 3,4,以此类推。我知道这符合 SAC 范式,但想知道如何使用 ddply 来做到这一点。请问有什么建议吗?非常感谢提前

4

1 回答 1

1

首先,让我们获取您的示例对象:

d <- data.frame( id1= c(rep("A",4), rep("B",4)),  val=c(rep("1",4), rep("2",4)) )

做你想做的事的一种方便的方法就是:

> d$val <- rep( 1:(nrow(d)/2), each=2)
> d
  id1 val
1   A   1
2   A   1
3   A   2
4   A   2
5   B   3
6   B   3
7   B   4
8   B   4

就是这样。

例如,使用 split-apply-combine 方法的一个原因是有一个具体取决于列值组合的编号。您可以根据andddply拆分行,并获得不同类型的编号:id1val

f <- function(x){ rep(1:(length(x)/2), each=2) }
ddply(d, .(id1), transform, val = f(val) )

   id1 val
1   A   1
2   A   1
3   A   2
4   A   2
5   B   1
6   B   1
7   B   2
8   B   2

研究定义f并进行算术运算肯定会导致您找到解决方案,但如果以下假设描述了您想要的内容:

  • 每 2 行增加 +1
  • A 和 B 总是以偶数出现

那么我不明白这一点......申请rep(x, each=2)d这份工作!

于 2012-09-20T14:02:22.247 回答