2015-02-19 1 views
2

У меня есть простой dataframe, который выглядит следующим образом:Выражая интервалы между переменными в широком dataframe

name sample1 sample2 sample3 
    V01  1  2  3 
    V02  10  20  30 
    V03  100  200  300 

создали здесь:

DF <- data.frame(name=c("V01", "V02", "V03"), sample1=c(1,10,100), sample2=c(2,20,200), sample3=c(3,30,300)) 

Я пытаюсь побить этот кадр данных, чтобы посмотреть, как например:

name begin end 
    V01  1  2 
    V01  2  3 
    V02  10 20 
    V02  20 30 
    V03  100 200 
    V03  200 300 

Я рефлекторно посмотрел на tidy и reshape2, б ut Я начинаю понимать, что мне действительно не нужно просто изменять эту фреймворк, мне нужно найти способ выразить интервал между значениями. Я чувствую, что это скорее проблема времени, чем проблема переформатирования. Или это скорее вопрос выполнения какой-то разностной операции, а затем переформатирование результатов.

Каков наилучший способ решения этой проблемы? Есть ли способ решить это с помощью tidy, который я не могу понять?

+0

, кстати, это число столбцов малое и фиксированный? –

ответ

1

Похоже, вы могли бы получить там просто создав два новых набора данных, один с столбцом sample3, а другой с sample1, а затем объединив их с rbind после переименования столбцов.

Я буду писать код, чтобы сделать это, но я сомневаюсь, что я закончу, прежде чем кто-то бьет меня тоже (это довольно поздно здесь :)

+0

bummer! Я бы тоже принял ваш ответ :) –

+0

Да, но писать код козыри прозы. Я был слишком медленным. –

4

Просто подмножество и связать вместе?

DF1 <- DF[-4] 
DF2 <- DF[-2] 
colnames(DF1) <- colnames(DF2) <- c("name", "begin", "end") 
rbind(DF1, DF2) 
+0

черт побери меня на 48 секунд ... – Rentrop

+0

Черт, получил удар, прежде чем я даже начал студию R ... –

+0

Было слишком легко ... –

2

Только в том случае, число столбцов переменное:

library(dplyr) 
library(tidyr) 

d %>% 
    mutate(i=1:n()) %>% 
    gather(k, v, -name, -i) %>% 
    arrange(i) %>% 
    mutate(begin=value, end=lead(value)) %>% 
    filter(variable!=names(d)[ncol(d)]) %>% 
    select(name, begin, end) 

# name begin end 
# 1 V01  1 2 
# 2 V01  2 3 
# 3 V02 10 20 
# 4 V02 20 30 
# 5 V03 100 200 
# 6 V03 200 300 
Смежные вопросы