6

所以我有一个看起来像这样的 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

我怎样才能把它变成这个?谢谢

4

2 回答 2

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)

方法一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:基础Rreshape

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
于 2013-07-05T05:08:02.093 回答
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")]
于 2013-07-05T04:56:19.087 回答