2014-01-03 4 views
0

У меня есть файл в R, который выглядит следующим образом:Генерация строки данных из data.frame в R

Sample top bot value 
A1  0 10 20 
A2  10 20 23 
A3  20 25 12 
A4  25 30 23 

Мне нужно, чтобы раздуть это приращения сверху и снизу и разделить значение среди тех

Sample top bot value 
A1  0 1 2 
A1  1 2 2 
A1  2 3 2 
A1  3 4 2 
A1  4 5 2 
A1  5 6 2 
... 

Я думаю, мне нужно создать цикл for, но не знаю, как сгенерировать новый data.frame. Его сложно найти что-то об этом, так как большинство вопросов направлены на хруст данных, вместо того, чтобы взорвать его.

ответ

4

Вы можете использовать lapply применить функцию к подмножествам кадра данных:

# Your data frame: 
dat <- read.table(text = "Sample top bot value 
A1  0 10 20 
A2  10 20 23 
A3  20 25 12 
A4  25 30 23", header = TRUE) 


do.call(rbind, lapply(seq(nrow(dat)), function(x) { 
    tmp <- seq(dat$top[x], dat$bot[x]) 
    top <- head(tmp, -1) 
    bot <- tmp[-1] 
    value <- dat$value[x]/length(top) 
    data.frame(Sample = dat$Sample[x], top, bot, value) 
})) 

Это возвращает:

Sample top bot value 
1  A1 0 1 2.0 
2  A1 1 2 2.0 
3  A1 2 3 2.0 
4  A1 3 4 2.0 
5  A1 4 5 2.0 
6  A1 5 6 2.0 
7  A1 6 7 2.0 
8  A1 7 8 2.0 
9  A1 8 9 2.0 
10  A1 9 10 2.0 
11  A2 10 11 2.3 
12  A2 11 12 2.3 
13  A2 12 13 2.3 
14  A2 13 14 2.3 
15  A2 14 15 2.3 
16  A2 15 16 2.3 
17  A2 16 17 2.3 
18  A2 17 18 2.3 
19  A2 18 19 2.3 
20  A2 19 20 2.3 
21  A3 20 21 2.4 
22  A3 21 22 2.4 
23  A3 22 23 2.4 
24  A3 23 24 2.4 
25  A3 24 25 2.4 
26  A4 25 26 4.6 
27  A4 26 27 4.6 
28  A4 27 28 4.6 
29  A4 28 29 4.6 
30  A4 29 30 4.6 
+0

Он хорошо работает с этим примером, но в моих исходных данных я получаю Ошибка в seq.default (x $ top, x $ bot)): 'from' должен быть длиной 1 Исходные данные в плавающих числах, хотя все это заканчивается на .0, может быть, проблема? – mace

+0

@mace У вас есть значения 'Sample' с более чем одной строкой? –

+0

Да, у меня их много. – mace

Смежные вопросы