2013-07-05 4 views
5

Таким образом, у меня есть выход R, который выглядит, как этоткадр Переупорядочивание данных в R

Time 50 100 150 200 250 300 350 
Carla 1.2 1.8 2.2 2.3 3.0 2.5 1.8 
Mace 1.5 1.1 1.9 2.0 3.6 3.0 2.5 
Lea 1.7 1.6 2.3 2.7 2.6 2.2 2.6 
Karen 1.3 1.7 1.9 2.2 3.2 1.5 1.9 

Я хочу, чтобы это выглядело как этот

Time Score Name 
50 1.2  Carla 
50 1.5  Mace 
50 1.7  Lea 
50 1.3  Karen 
100 1.8  Carla 
100 1.5  Mace 
100 1.7  Lea 
100 1.3  Karen 

Как я могу превратить его в этом? Спасибо

+1

ли, что '' table' в matrix' или 'data.frame'? Можете ли вы 'dput (objectname)', чтобы я знал, с чем вы имеете дело? – thelatemail

ответ

9

Два метода, ни требующих внешних пакетов:

# get the data, the number labelled columns get automatically renamed 
# to say 'X50' instead of '50' 
test <- read.table(text="Time 50 100 150 200 250 300 350 
Carla 1.2 1.8 2.2 2.3 3.0 2.5 1.8 
Mace 1.5 1.1 1.9 2.0 3.6 3.0 2.5 
Lea 1.7 1.6 2.3 2.7 2.6 2.2 2.6 
Karen 1.3 1.7 1.9 2.2 3.2 1.5 1.9",header=TRUE) 

Метод 1: as.data.frame.table

rownames(test) <- test$Time 
result <- setNames(as.data.frame.table(as.matrix(test[-1])),c("Name","Time","Score")) 
result$Time <- gsub("X","",result$Time) 

> head(result) 
    Name Time Score 
1 Carla 50 1.2 
2 Mace 50 1.5 
3 Lea 50 1.7 
4 Karen 50 1.3 
5 Carla 100 1.8 
6 Mace 100 1.1 

Метод 2: основание R reshape

result <- reshape(test, idvar="Time", varying=-1, direction="long", sep="") 
names(result) <- c("Name","Time","Score") 

> head(result) 
      Name Time Score 
Carla.50 Carla 50 1.2 
Mace.50 Mace 50 1.5 
Lea.50  Lea 50 1.7 
Karen.50 Karen 50 1.3 
Carla.100 Carla 100 1.8 
Mace.100 Mace 100 1.1 
1

скопировать набор данных непосредственно здесь и обрабатываются его немного:

library(reshape2) 

data <- read.fwf("data.txt",widths=c(7,5,7,5,4,4,4,3)) 
data <- data.frame(lapply(data,function(x){gsub(" ","",x)}),stringsAsFactors=FALSE) 
data <- data.frame(lapply(data,as.character),stringsAsFactors=FALSE) 
names(data) <- data[1,] 
data <- data[-1,] 

data <- melt(data,id.vars=c("Time")) 
names(data) <- c("Name","Time","Score") 
data <- data[,c("Time","Score","Name")] 
Смежные вопросы