我有一个如下所示的数据框:
> print(df)
person step start end
1 sam A 0 4
2 sam B 4 6
3 greg A 2 7
4 greg B 7 11
我创建了以下情节:
ggplot(df, aes(colour=step)) +
geom_segment(aes(x=start, xend=end, y=person, yend=person), size=3) +
xlab("Duration")
这看起来与我希望的完全一样。但是,我的输入数据结构已更改为以下内容:
step sam greg
1 A 0 2
2 B 4 7
3 C 6 11
这个结构具有基本相同的含义,但我不知道如何轻松转换它,以便geom_segment
了解它现在是列式而不是每行。我是否需要将其转换回旧的数据结构(包括开头和结尾),还是可以以某种方式解决这个问题?
答案 0 :(得分:2)
这实际上不是ggplot2
问题,而是一个数据争论问题,目标是根据您的第二个数据框创建您的第一个数据框。以下是dplyr
和tidyr
的选项。
library(dplyr)
library(tidyr)
dat2 <- dat %>%
gather(person, Value, -step) %>%
group_by(person) %>%
slice(rep(row_number(), each = 2)) %>%
slice(2:(n() - 1)) %>%
mutate(Type = rep(c( "start", "end"), times = n()/2),
step = rep(LETTERS[1:(n()/2)], each = 2)) %>%
spread(Type, Value) %>%
arrange(person, step) %>%
select(step, person, start, end) %>%
arrange(desc(person), step) %>%
ungroup()
dat2
# # A tibble: 4 x 4
# step person start end
# <chr> <chr> <int> <int>
# 1 A sam 0 4
# 2 B sam 4 6
# 3 A greg 2 7
# 4 B greg 7 11
数据强>
dat <- read.table(text = " step sam greg
1 A 0 2
2 B 4 7
3 C 6 11",
header = TRUE, stringsAsFactors = FALSE)