2012-01-29 57 views
0

我需要使用R.轉換列值到行名稱,使用R

例如轉換格式1,以轉換列值入行名稱爲FORMAT2

var<-c("Id", "Name", "Score", "Id", "Score", "Id", "Name") 
num<-c(1, "Tom", 4, 2, 7, 3, "Jim") 
format1<-data.frame(var, num) 

format1 

    var num 
1 Id 1 
2 Name Tom 
3 Score 4 
4 Id 2 
5 Score 7 
6 Id 3 
7 Name Jim 

小心,也有在遺漏值format1,我猜這就是挑戰。

Id<-c(1, 2, 3) 
Name<-c("Tom", NA, "Jim") 
Score<-c(4, 7, NA) 
format2<-data.frame(Id, Name, Score) 

format2 

    Id Name Score 
1 1 Tom  4 
2 2 <NA>  7 
3 3 Jim NA 

# How to convert format1 into format2? 

我可能沒有確切的表達方式,但是,您可以參考上面給出的玩具數據。

我知道一個關於重塑和reshape2的垃圾,但是,我無法使用它們轉換數據格式。

回答

2
format1$ID <- cumsum(format1$var == "Id") 
format2 <- reshape(format1, idvar = "ID",timevar = "var", direction = "wide")[-1] 
names(format2) <- gsub("num.", "", names(format2) 
# Id Name Score 
# 1 1 Tom  4 
# 4 2 <NA>  7 
# 6 3 Jim <NA> 

另外,如果你想跳過gsub()一步,你可以直接通過varying參數指定輸出列名:

reshape(format1, idvar = "ID",timevar = "var", direction = "wide", 
     varying = list(c("Id", "Name", "Score")))[-1] 
2

添加標識符列後,您可以使用dcast

format1$pk <- cumsum(format1$var=="Id") 
library(reshape2) 
dcast(format1, pk ~ var, value.var="num") 
+0

構建PK的很不錯的主意。但是,dcast的結果與上面給出的format2不完全相同。你介意再次檢查結果嗎? – 2012-01-29 08:34:22

+0

; df < - as.data.frame(t(reshape(format1,idvar = c('var'),timevar ='pk',direction ='wide'))); colnames(df)< - df [1,]; df < - df [-1,] – 2012-01-29 08:56:58