我有一个简单的数据框,如下所示:
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
,但我开始意识到我并不需要简单地重塑这个数据帧,我需要找到一些方法来表达值之间的间隔。我觉得这比时间序列问题更重要,而不是重新格式化问题。或者,更多的是执行某种差异操作,然后重新格式化结果。
解决此类问题的最佳方法是什么?有没有办法用tidy
单独解决这个问题,我无法弄明白?
答案 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组合。
我会写一些代码来做,但我怀疑我会在有人打败我之前完成它(这里已经很晚了)。