从矩阵中重复项目创建矢量

时间:2011-08-22 20:13:20

标签: r

我有一个数据框m

A   2
B   3
C   4

我想创建一个像

这样的数据框
A 1
A 2
B 1
B 2
B 3
C 1
C 2
C 3
C 4

有任何帮助吗?非常感谢提前

4 个答案:

答案 0 :(得分:5)

您的原始问题可以通过以下方式回答:

text <- LETTERS[1:3]
n <- 2:4

rep(text, times=n)

[1] "A" "A" "B" "B" "B" "C" "C" "C" "C"

你的新问题非常不同:

df <- data.frame(
  text <- LETTERS[1:3],
  n <- 2:4
)  

data.frame(
    text = rep(df$text, times=df$n),
    seq  = sequence(df$n)
)

  text seq
1    A   1
2    A   2
3    B   1
4    B   2
5    B   3
6    C   1
7    C   2
8    C   3
9    C   4

答案 1 :(得分:3)

假设m是一个数据框:

m <- data.frame(V1 = LETTERS[1:3], V2 = 2:4, stringsAsFactors = FALSE)

这将做你想要的:

with(m, rep(V1, times = V2))

e.g。

> with(m, rep(V1, times = V2))
[1] "A" "A" "B" "B" "B" "C" "C" "C" "C"

编辑:要解决OP所做的编辑,请尝试以下操作:

with(m, data.frame(X1 = rep(V1, times = V2), 
                   X2 = unlist(lapply(V2, seq_len))))

产生:

>  with(m, data.frame(X1 = rep(V1, times = V2), 
+                        X2 = unlist(lapply(V2, seq_len))))
  X1 X2
1  A  1
2  A  2
3  B  1
4  B  2
5  B  3
6  C  1
7  C  2
8  C  3
9  C  4

或更简洁地通过sequence() - 根据@Andrie的答案(我也一直忘记):

with(m, data.frame(X1 = rep(V1, times = V2), X2 = sequence(V2)))

答案 2 :(得分:3)

rep接受矢量。试试这个:

dat <- data.frame(V1 = letters[1:3], V2 = 2:4)

rep(dat[, 1], dat[, 2])


> rep(dat[, 1], dat[, 2])
[1] a a b b b c c c c

答案 3 :(得分:2)

到目前为止,@ Andrie的答案是唯一能回答你新问题的答案。可能有更好的方法,但是:

m <- data.frame(V1 = LETTERS[1:3], V2 = 2:4, stringsAsFactors = FALSE)
library(plyr)
ddply(m,"V1",function(x) data.frame(V2=seq(x[,2])))