2017-05-30 48 views
1

我有這樣的,我要重塑和改造成列的文件:如何重塑文本文件?

fe=read.table("foo.txt") 
    > fe 
      V1 
    1   9 
    2  Sd 
    3   2 
    4  Sd 
    5   5 
    6  Smn 
    7   7 
    8  Smn 
    9   5 
    10  bf 
    11   4 
    12  bf 

> str(fe) 
'data.frame': 12 obs. of 1 variable: 
    $ V1: Factor 

所需的輸出:

Sd 9 2 
Smn 5 7 
bf 5 4 

回答

3

另一種選擇:

# step 1: create new dataframe 
fe2 <- data.frame(id = fe$V1[c(FALSE,TRUE)], 
        num = as.numeric(as.character(fe$V1[c(TRUE,FALSE)]))) 

# step 2: reshape into the desired format 
fe2$rid <- with(fe2, ave(as.character(id), id, FUN = seq_along)) 
reshape(fe2, idvar = "id", timevar = "rid", direction = "wide") 

它返回一個data.frame:

id num.1 num.2 
1 Sd  9  2 
3 Smn  5  7 
5 bf  5  4 

作爲步驟2的替代,也可以使用data.table -package:

# step 2 (alternative): reshape into the desired format 
library(data.table) # v1.9.8 or higher is required for the 'rowid'-function 
dcast(setDT(fe2), id ~ rowid(id, prefix = 'num.'), value.var = 'num') 

這將返回一個數據表(其是增強型數據幀),其具有與基本R解決方案相同的結構。

+0

你有什麼版本的'data.table'?此功能來自* v1.9.8 *及更高版本。 – Jaap

+0

@bicton使用完整的基礎R解決方案查看更新;對於第二步的'data.table'-alternative,你可能需要將'data.table'包更新爲最新版本(當前爲* v1.10.4 *) – Jaap

2

我們通過轉換爲一個matrix,然後重塑列「V1」 data.frame,然後unstack並轉以獲得期望的輸出

d1 <- as.data.frame(matrix(fe$V1, ncol=2, byrow = TRUE)) 
d1$V1 <- as.integer(as.character(d1$V1)) 
res <- t(unstack(d1, V1~V2)) 
res 
# [,1] [,2] 
#bf  5 4 
#Sd  9 2 
#Smn 5 7