Плавление и повторная передача на основе имени исходного столбца фрейма данных

#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