#r #reshape
#r #изменение формы
Вопрос:
Мне сложно изменить форму фрейма данных для использования с графиками столбцов ошибок, объединив все столбцы с данными о тенденции к централизации и, отдельно, все столбцы с данными об ошибках.
Я начинаю с фрейма данных со столбцом для независимой переменной, а затем двумя столбцами для каждого измеряемого параметра: один для среднего значения и один для ошибки, поскольку вы обычно форматируете электронную таблицу с такого рода данными. Исходный фрейм данных выглядит следующим образом:
df<-data.frame(
indep=1:3,
Amean=runif(3),
Aerr=rnorm(3),
Bmean=runif(3),
Berr=rnorm(3)
)
Я хотел бы использовать расплав и dcast, чтобы придать ему форму, которая выглядит следующим образом:
df.cast<-data.frame(
indep=rep(1:3, 2),
series=c(rep("A", 3),
rep("B", 3)),
means=runif(6),
errs=rnorm(6)
)
Чтобы затем я мог передать его в ggplot следующим образом:
qplot(data=df.cast, x=indep, y=means, ymin=means-errs, ymax=means errs,
col=series, geom="errorbar")
Я пытался плавить, а затем переделывать, используя выражения, подобные этому:
df.melt<-melt(df, id.vars="indep")
dcast(df.melt,
indep~(variable=="Amean"|variable=="Bmean") (variable=="Aerr"|variable=="Berr")
)
но они возвращают фрейм данных со смешными логическими столбцами.
Я мог бы вручную создать два фрейма данных (один для средних значений, один для ошибок), расплавить их по отдельности и рекомбинировать, но наверняка должен быть более элегантный способ?
Ответ №1:
Вот как я бы это сделал:
# Melt the data
mdf <- melt(df, id.vars="indep")
# Separate the series from the statistic with regular expressions
mdf$series <- gsub("([A-Z]).*", "\1", mdf$variable)
mdf$stat <- gsub("[A-Z](.*)", "\1", mdf$variable)
# Cast the data (after dropping the original melt variable
cdf <- dcast(mdf[, -2], indep series ~ stat)
# Plot
qplot(data=cdf, x=indep, y=mean, ymin=mean-err, ymax=mean err,
colour=series, geom="errorbar")
Ответ №2:
Вы можете выполнить это с помощью reshape
в базовом R
df.cast <- reshape(df, varying = 2:5, direction = 'long', timevar = 'series',
v.names = c('mean', 'err'), times = c('A', 'B'))
qplot(data = df.cast, x = indep, y = mean, ymin = mean - err, ymax = mean err,
colour = series, geom = "errorbar")
Комментарии:
1. 1 за отработанный пример reshape(). За исключением того, что вам нужно использовать имя «time» вместо «series», чтобы заставить его работать должным образом
2. это используется по умолчанию
reshape
. его можно изменить, установивtimevar = series
в вызове. я отредактировал свое решение, чтобы отразить это.3. И это тоже полезно. Страница справки для reshape действительно нуждается в переписывании. Мне потребовалось 4, нет, 9 лет, чтобы научиться продуктивно им пользоваться.
4. я собираю короткий набор из 2-3 слайдов, которые должны сделать его очень простым (надеюсь) в использовании
reshape