2014-10-24 2 views
0

У меня есть повторяющаяся проблема. Я часто имею несколько векторов или столбцов в data.frame, представляющем условия. Например:Включение столбцов в data.frame (или векторы) в факторы

condition_1 condition_2 condition_3 
5.3   2.6   1.2 
25.5  2.2   1.4 
13.1  0.1   9.2 
... 

Часто я хочу сравнить эти условия с помощью ANOVA. Тем не менее, большинство функций ANOVA нужны данные должны быть указаны в качестве факторов, например:

value condition 
5.3 condition_1 
25.5 condition_1 
13.1 condition_1 
2.6 condition_2 
2.2 condition_2 
0.1 condition_2 
1.2 condition_3 
1.4 condition_3 
9.2 condition_3 
... 

Есть быстрый и простой способ для преобразования R от первого до последнего форматирования?

ответ

3

Несомненно. Вы можете использовать stack. Это не обязательно «быстро», но это легко.

stack(df) 
# values   ind 
# 1 5.3 condition_1 
# 2 25.5 condition_1 
# 3 13.1 condition_1 
# 4 2.6 condition_2 
# 5 2.2 condition_2 
# 6 0.1 condition_2 
# 7 1.2 condition_3 
# 8 1.4 condition_3 
# 9 9.2 condition_3 
sapply(stack(df), class) 
# values  ind 
# "numeric" "factor" 

где df является

structure(list(condition_1 = c(5.3, 25.5, 13.1), condition_2 = c(2.6, 
2.2, 0.1), condition_3 = c(1.2, 1.4, 9.2)), .Names = c("condition_1", 
"condition_2", "condition_3"), class = "data.frame", row.names = c(NA, 
-3L)) 
+0

+1: никогда не замечал стек до –

3

Альтернативный подход с melt из reshape2:

dat <- read.table(text="condition_1 condition_2 condition_3 
5.3   2.6   1.2 
25.5  2.2   1.4 
13.1  0.1   9.2", stringsAs=FALSE, header=TRUE) 

library(reshape2) 

dat_m <- melt(dat) 
dat_m 

##  variable value 
## 1 condition_1 5.3 
## 2 condition_1 25.5 
## 3 condition_1 13.1 
## 4 condition_2 2.6 
## 5 condition_2 2.2 
## 6 condition_2 0.1 
## 7 condition_3 1.2 
## 8 condition_3 1.4 
## 9 condition_3 9.2 

str(dat_m) 

## 'data.frame': 9 obs. of 2 variables: 
## $ variable: Factor w/ 3 levels "condition_1",..: 1 1 1 2 2 2 3 3 3 
## $ value : num 5.3 25.5 13.1 2.6 2.2 0.1 1.2 1.4 9.2 
+0

Но у вас в базе/utils, так что это бесплатная библиотека :-) – hrbrmstr

3

Или используя новый tidyr пакет

library(tidyr) 
gather(dat, condition, value, condition_1:condition_3) 
#  condition value 
# 1 condition_1 5.3 
# 2 condition_1 25.5 
# 3 condition_1 13.1 
# 4 condition_2 2.6 
# 5 condition_2 2.2 
# 6 condition_2 0.1 
# 7 condition_3 1.2 
# 8 condition_3 1.4 
# 9 condition_3 9.2 
Смежные вопросы