表示宽数据帧中变量之间的间隔

时间:2015-02-19 20:26:41

标签: r

我有一个简单的数据框,如下所示:

  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

我反思地看向tidyreshape2,但我开始意识到我并不需要简单地重塑这个数据帧,我需要找到一些方法来表达值之间的间隔。我觉得这比时间序列问题更重要,而不是重新格式化问题。或者,更多的是执行某种差异操作,然后重新格式化结果。

解决此类问题的最佳方法是什么?有没有办法用tidy单独解决这个问题,我无法弄明白?

3 个答案:

答案 0 :(得分:4)

只是将子集绑定在一起吗?

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

答案 1 :(得分: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

答案 2 :(得分:1)

好像你可以通过创建两个新的数据集来实现这一目标,一个是删除了列sample3,另一个是sample1,然后在重命名列后将它们与rbind组合。

我会写一些代码来做,但我怀疑我会在有人打败我之前完成它(这里已经很晚了)。