2017-03-24 58 views
0

我有一個數據集是這樣的:變換的數據幀與觀測(人)的總數爲一個具有行對每個觀測(人)

> df<-data.frame(gender=c(rep("male",3),rep("female",3)), 
    Age=c(rep("old",3),rep("young",3)),VAR=c(rep(1:3),rep(1:3)), 
    FEN1=c(21,26,29,30,6,11),FEN2=c(14,55,12,33,9,21), 
    FEN3=c(88,23,55,23,14,66)) 

凡FEN1,FEN2和FEN3包含總具有VAR,Gender,Age,FEN等欄目特徵的人數。

我需要將其更改爲數據框,其中每行屬於一個人(共536行),具有VAR,Gender,Age列的特徵。

預期的輸出將包含:

  • 21行的信息:男性,老,1,FEN1
  • 14行與信息:男性,老,1,FEN2
  • 88行與信息:男性,老,1,FEN3
  • 26行與信息:男性,老,2,FEN1
  • 55行與信息:男,舊,2,FEN2
  • 23行機智^ h信息:男,老,2,FEN3
  • 等等...

我試圖通過手像一個代碼來做到這一點:

> df2<-as.data.frame(1:536) 
    > FEN <- c(rep("FEN1",123), rep("FEN2",144), rep("FEN3",269)) 
    > df2$FEN<-FEN 
    > Gender<-c(rep("male",...)... 

但顯然它不是非常有效。

+0

最終你可以重塑從廣泛到長http://stackoverflow.com/questions/2185252/reshaping-data-frame-from-wide-to-long-format然後使用數字來複制t他排。或者對於每行你從FEN1,FEN2,FEN3獲取數字,併爲以後的rbind()構造新的數據幀。 – jogo

回答

2

這是一種使用基本R方法的方法。

# get the vector names that are used to repeat 
fenCats <- tail(names(df), 3) 
# construct a list of data.frames where the rows have been repeated 
# one data.frame for each of the FEN variables 
temp <- Map(function(x) df[rep(seq_len(nrow(df)), x), 1:3], df[fenCats]) 
# combine list of data.frames and add column with FEN categories 
dfNew <- cbind(do.call(rbind, temp), 
       "fenCats"=rep(fenCats, colSums(df[fenCats]))) 

我們可以驗證的行數是正確與

nrow(dfNew) == sum(colSums(df[fenCats])) & 
nrow(dfNew) == sum(rowSums(df[fenCats])) 
[1] TRUE 

作爲一個額外的驗證,我們還可以通過使用子集和cumsum拉動每個組的第一行進行快速驗證:

dfNew[cumsum(unlist(df[,fenCats])),] 
      gender Age VAR fenCats 
FEN1.1.20 male old 1 FEN1 
FEN1.2.25 male old 2 FEN1 
FEN1.3.28 male old 3 FEN1 
FEN1.4.29 female young 1 FEN1 
FEN1.5.5 female young 2 FEN1 
FEN1.6.10 female young 3 FEN1 
FEN2.1.13 male old 1 FEN2 
FEN2.2.54 male old 2 FEN2 
FEN2.3.11 male old 3 FEN2 
FEN2.4.32 female young 1 FEN2 
FEN2.5.8 female young 2 FEN2 
FEN2.6.20 female young 3 FEN2 
FEN3.1.87 male old 1 FEN3 
FEN3.2.22 male old 2 FEN3 
FEN3.3.54 male old 3 FEN3 
FEN3.4.22 female young 1 FEN3 
FEN3.5.13 female young 2 FEN3 
FEN3.6.65 female young 3 FEN3 
相關問題