2015-04-14 2 views
1

Я надеюсь использовать R для создания сводных таблиц быстрее, чем с Excel (и уменьшить пространство для ошибок.Excel Pivot-таблица как функциональность с R (plyr, ddplyr?)

Например, если у меня есть набор данных, как это:

id<-c("p","q","r","s","t","u","p","q","r","s","t","u") 
time<-c(0,0,0,0,0,0,1,1,1,1,1,1) 
foldchange<-rnorm(12) 
log2foldchange<-rnorm(12) 
p.value<-rnorm(12) 
df<-data.frame(id,time,foldchange,log2foldchange,p.value) 

, и я хочу, чтобы отсортировать таблицу, как я бы в Excel с помощью сводной таблицы выглядеть следующим образом (или как можно ближе): enter image description here

Любые идеи можно не выяснить, как это сделать (или что-нибудь такое t напоминает это) из приведенных здесь примеров.

Спасибо!

ответ

4

set.seed Вы должны, если вы собираетесь генерировать случайные числа для примера

set.seed(1) 
id<-c("p","q","r","s","t","u","p","q","r","s","t","u") 
time<-c(0,0,0,0,0,0,1,1,1,1,1,1) 
foldchange<-rnorm(12) 
log2foldchange<-rnorm(12) 
p.value<-rnorm(12) 
df<-data.frame(id,time,foldchange,log2foldchange,p.value) 


reshape(df, dir = 'wide', idvar = 'id', timevar = 'time') 

# id foldchange.0 log2foldchange.0 p.value.0 foldchange.1 log2foldchange.1 p.value.1 
# 1 p -0.6264538  -0.62124058 0.61982575 0.4874291  0.82122120 1.35867955 
# 2 q 0.1836433  -2.21469989 -0.05612874 0.7383247  0.59390132 -0.10278773 
# 3 r -0.8356286  1.12493092 -0.15579551 0.5757814  0.91897737 0.38767161 
# 4 s 1.5952808  -0.04493361 -1.47075238 -0.3053884  0.78213630 -0.05380504 
# 5 t 0.3295078  -0.01619026 -0.47815006 1.5117812  0.07456498 -1.37705956 
# 6 u -0.8204684  0.94383621 0.41794156 0.3898432  -1.98935170 -0.41499456 

или просто

reshape(df, dir = 'wide') 

# id foldchange.0 log2foldchange.0 p.value.0 foldchange.1 log2foldchange.1 p.value.1 
# 1 p -0.6264538  -0.62124058 0.61982575 0.4874291  0.82122120 1.35867955 
# 2 q 0.1836433  -2.21469989 -0.05612874 0.7383247  0.59390132 -0.10278773 
# 3 r -0.8356286  1.12493092 -0.15579551 0.5757814  0.91897737 0.38767161 
# 4 s 1.5952808  -0.04493361 -1.47075238 -0.3053884  0.78213630 -0.05380504 
# 5 t 0.3295078  -0.01619026 -0.47815006 1.5117812  0.07456498 -1.37705956 
# 6 u -0.8204684  0.94383621 0.41794156 0.3898432  -1.98935170 -0.41499456 

очень прямой вперед, прямо @ data.table?

+0

Ничего себе, как смущающе легко! Спасибо, сырой! – MarinaWM

2

Использование data.table v1.9.5, это довольно просто:

require(data.table) # v1.9.5+ 
dcast(setDT(df), id ~ time, value.var = names(df)[3:5]) 

PS: Я предполагаю, что р-значения только ради этого здесь .., так как они -ve /> 1. Вы должны генерировать случайные значения из равномерного распределения.

+0

Привет, да, значения p здесь только ради этого. Я попробовал ваше предложение, но у меня появляется сообщение об ошибке: «Ошибка в .subset2 (x, i, exact = exact): ошибка рекурсивного индексирования на уровне 2 Кроме того: Предупреждающее сообщение: In if (! (Value. var% in% names (data))) {: условие имеет длину> 1, и будет использоваться только первый элемент ". Помогите! – MarinaWM

+1

Вы, кажется, загрузили 'reshape2' после' data.table'. Либо загрузите 'reshape2' перед' data.table' или не загружать 'reshape2' вообще .. и должен работать с 1.9.5. – Arun

0

И с менее интуитивным dplyr и tidyr

library(dplyr); library(tidyr) 
df %>% gather(name, value, c(-id, -time)) %>% mutate(new=paste(name, time, sep=".")) %>% 
    select(-time, -name) %>% spread(new, value) 

Логика заключается в следующем:

Транспонирования данных для foldchange в p.value это делается с кодом df %>% gather(name, value, c(-id, -time)).

Следующая конкатенации переменные, которые вы хотите иметь, как column labels в Excel это делается с mutate(new=paste(name, time, sep=".")) части

И, наконец, транспонировать каскадный переменную через spread(new, value), имеющие первую выбранные столбцы, которые вы заинтересованы в.

В зависимости о том, как бы вы их отсортированных (столбцы), вы также можете попробовать

df %>% gather(name, value, c(-id, -time)) %>% mutate(new=paste(time, name, sep=".")) %>% 
    select(-time, -name) %>% spread(new, value) 

разница заключается mutate(new=paste(time, name, sep="."))

Смежные вопросы