R:" Disaccumulate"将数据集变量计入各行

时间:2015-02-20 21:41:25

标签: r

我是R的初学者,花了几个小时试图解决问题。

我会“解除”数据集中变量的值,从而获得行中的单个观察值。我认为最好用一个例子来解释。

我会从:

Variable 1   Variable 2   Count
 GROUP1         A           3
 GROUP1         B           2
 GROUP2         A           2
 GROUP2         B           4

为:

Variable 1   Variable 2   Count
 GROUP1         A           1
 GROUP1         A           1
 GROUP1         A           1
 GROUP1         B           1
 GROUP1         B           1
 GROUP2         A           1
 GROUP2         A           1
 GROUP2         B           1
 GROUP2         B           1
 GROUP2         B           1
 GROUP2         B           1

我想也许我可以使用apply来解决这个问题,但我尝试过使用融合,使用strsplit,xtabs ...但是我没有得到结果。

非常感谢您提前问候。

3 个答案:

答案 0 :(得分:3)

使用@bgoldst数据集

您可以按count变量

给出的次数重复每一行

编辑正如Marat在评论中所建议的那样(感觉有点安全)

y <- x[rep(1:nrow(x), x$count), ]

而不是

y <- x[rep(row.names(x), x$count), ]

然后将count设置为一个

y$count <- 1

答案 1 :(得分:3)

使用splitstackshape

的选项
library(splitstackshape)
expandRows(setDT(df1), 'Count', drop=FALSE)[,Count:=1][]
#    Variable 1 Variable 2 Count
#1:     GROUP1          A     1
#2:     GROUP1          A     1
#3:     GROUP1          A     1
#4:     GROUP1          B     1
#5:     GROUP1          B     1
#6:     GROUP2          A     1
#7:     GROUP2          A     1
#8:     GROUP2          B     1
#9:     GROUP2          B     1
#10:    GROUP2          B     1
#11:    GROUP2          B     1

数据

df1 <- structure(list(`Variable 1` = c("GROUP1", "GROUP1", "GROUP2", 
"GROUP2"), `Variable 2` = c("A", "B", "A", "B"), Count = c(3L, 
2L, 2L, 4L)), .Names = c("Variable 1", "Variable 2", "Count"),
class = "data.frame", row.names = c(NA, -4L))

答案 2 :(得分:2)

这是一个解决方案:

r> x <- data.frame(v1=c('GROUP1','GROUP1','GROUP2','GROUP2'), v2=c('A','B','A','B'), count=c(3,2,2,4) );
r> x;
      v1 v2 count
1 GROUP1  A     3
2 GROUP1  B     2
3 GROUP2  A     2
4 GROUP2  B     4
r> y <- cbind(do.call(rbind, lapply(1:nrow(x), function(r) do.call(rbind, replicate(x[r,'count'], x[r,names(x)[names(x)!='count']], simplify=F ) ) ) ), count=1 );
r> rownames(y) <- 1:nrow(y);
r> y;
       v1 v2 count
1  GROUP1  A     1
2  GROUP1  A     1
3  GROUP1  A     1
4  GROUP1  B     1
5  GROUP1  B     1
6  GROUP2  A     1
7  GROUP2  A     1
8  GROUP2  B     1
9  GROUP2  B     1
10 GROUP2  B     1
11 GROUP2  B     1