Создать вектор из повторений элементов из матрицы - PullRequest
1 голос
/ 23 августа 2011

У меня есть фрейм данных 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 ]

5 голосов
/ 23 августа 2011

На ваш оригинальный вопрос можно ответить:

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
3 голосов
/ 23 августа 2011

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 голосов
/ 23 августа 2011

Предполагая, m - это фрейм данных:

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

Это будет делать то, что вы хотите:

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

например,

> 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() - согласно @Ответ Андри (о котором я тоже постоянно забываю):

with(m, data.frame(X1 = rep(V1, times = V2), X2 = sequence(V2)))
2 голосов
/ 23 августа 2011

@ Ответ Андри пока единственный, который отвечает на ваш новый вопрос.Может быть лучший способ сделать это, но:

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])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...