Я имею дело с набором данных в широком формате, например
> data=read.csv("http://www.kuleuven.be/bio/ento/temp/data.csv")
> data
factor1 factor2 count_1 count_2 count_3
1 a a 1 2 0
2 a b 3 0 0
3 b a 1 2 3
4 b b 2 2 0
5 c a 3 4 0
6 c b 1 1 0
где factor1 и factor2 - это разные факторы, которые я хотел бы взять с собой (на самом деле у меня их больше 2, но это не имеет значения), а count_1 to count_3 - это количество агрессивных взаимодействий по порядковой шкале (3> 2> 1 ). Теперь я хотел бы преобразовать этот набор данных в длинный формат, чтобы получить что-то вроде
factor1 factor2 aggression
1 a a 1
2 a a 2
3 a a 2
4 a b 1
5 a b 1
6 a b 1
7 b a 1
8 b a 2
9 b a 2
10 b a 3
11 b a 3
12 b a 3
13 b b 1
14 b b 1
15 b b 2
16 b b 2
17 c a 1
18 c a 1
19 c a 1
20 c a 2
21 c a 2
22 c a 2
23 c a 2
24 c b 1
25 c b 2
Может ли кто-нибудь знать, как это сделать без использования циклов for ... to, например используя пакет reshape2
? (Я понимаю, что это должно работать с melt
, но я просто еще не смог придумать правильный синтаксис)
Изменить: для тех из вас, кому также может понадобиться такая функциональность, вот ответ Ананды ниже, завернутый в небольшую функцию:
widetolong.ordinal<-function(data,factors,responses,responsename) {
library(reshape2)
data$ID=1:nrow(data) # add an ID to preserve row order
dL=melt(data, id.vars=c("ID", factors)) # `melt` the data
dL=dL[order(dL$ID), ] # sort the molten data
dL[,responsename]=match(dL$variable,responses) # convert reponses to ordinal scores
dL[,responsename]=factor(dL[,responsename],ordered=T)
dL=dL[dL$value != 0, ] # drop rows where `value == 0`
out=dL[rep(rownames(dL), dL$value), c(factors, responsename)] # use `rep` to "expand" `data.frame` & drop unwanted columns
rownames(out) <- NULL
return(out)
}
# example
data <- read.csv("http://www.kuleuven.be/bio/ento/temp/data.csv")
widetolong.ordinal(data,c("factor1","factor2"),c("count_1","count_2","count_3"),"aggression")
melt
вreshape2
пакете. Просмотрите простые примеры здесь, и я уверен, что вы сможете определить соответствующиеid.vars
иmeasure.vars
в ваших собственных данных. - person Henrik   schedule 30.09.2013melt
. - person A5C1D2H2I1M1N2O1R2T1   schedule 01.10.2013