Данные столбца XY Plotting сгруппированы по другому столбцу - PullRequest
0 голосов
/ 26 ноября 2018

У меня очень большой набор данных с двумя столбцами, которые относятся, как показано ниже.

df <- data.frame(
  group = c("123-4", "123-4", "234-5", "234-5", "345-6", "345-6"),
  age = c(38, 41, 65, 67, 78, 23))

group      age
123-4 38
123-4 41
234-5 65
234-5 67
345-6 78
345-6 23

Я хочу иметь возможность составить график возраста для каждой группы друг против друга.Я могу сделать это, вытягивая минимальные и максимальные значения каждой группы, но я хочу сохранить случайность моего xy вместо того, чтобы иметь все минимальные значения x и все максимальные значения y.Кажется, это должно быть очень легко, но я бью головой о стенку пословицы.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Мистер Фликер прибил это с правильной идеей, длинной к широкой.Легко исправить, поскольку я знал, что это должно быть, но слишком новым, чтобы понять

wide <- as.data.frame((t(unstack(df,age~group))))
0 голосов
/ 26 ноября 2018

Мы можем написать вспомогательную функцию для точного определения значения для каждой группы.

group_val <- function(values, groups, index=1) tapply(values, groups, `[`, index)

Например,

with(df, group_val(age, group, 1))
# 123-4 234-5 345-6 
#    38    65    78 
with(df, group_val(age, group, 2))
# 123-4 234-5 345-6 
#    41    67    23 

Тогда вы могли бы сделать

plot(group_val(df$age, df$group, 1), group_val(df$age, df$group, 2))
# or plot(group_val(age, group, 2) ~ group_val(age, group, 1), df)

Хотя более обычным способом справиться с этим было бы преобразование ваших данных из длинных в длинные.широкий.На этом сайте есть много других вопросов об этой задаче.Но если вы хотите использовать gpplot, вам придется сделать это таким образом.Например

library(mutate)
library(tidyr)
library(ggplot2)
df %>% group_by(group) %>% 
  mutate(seq = letters[1:n()]) %>% 
  spread(seq, age) %>% 
  ggplot(aes(a,b)) + geom_point()
...