2017-03-24 141 views
1

我有一個包含兩列的文件。一個有5位數字代碼和一個數字。 下面是3個數字爲例:根據列中的代碼對數據進行排序R

Code Count 
101 1254 
103 1566 
221 459 
213 698 

現在我想,這樣它的代碼從最後一位數字後排序,以轉置數據:

 10x 11x 12x 13x 14x .... 19x 20x 21x 22x 23x 
xx1 1254          459 
xx2    
xx3 1566         698 

任何幫助表示讚賞。

回答

2

鑑於你例如,你可以做這樣的事情:

df$code_2 <- substr(df$Code, 1, 2) 
df$code_1 <- substring(df$Code, 3) 

它看起來像:

> df 
    Code Count code_2 code_1 
1 101 1254  10  1 
2 103 1566  10  3 
3 221 459  22  1 
4 213 698  21  3 

然後dcast

library(reshape2) 
dcast(df, code_1 ~ code2, value.var = 'Count') 

    code_1 10 21 22 
1  1 1254 NA 459 
2  3 1566 698 NA 

它正確格式:

rownames(df2) <- paste0('xx', df2$code_1) 
df2$code_1 <- NULL 
names(df2) <- paste0(names(df2), 'x') 

輸出:

df2 
    10x 21x 22x 
xx1 1254 NA 459 
xx3 1566 698 NA 
0

或者,你可以這樣做:

# create a sample dataset 
data <- data.frame(Code = c(101,103,221,213), Count = c(1254,1566,459,698)) 

# extract code start and end 
start <- sort(unique(substr(data$Code, 1,2))) 
end <- sort(unique(substr(data$Code, 3,3))) 

# create placeholder dataframe 
data2 <- sapply(start, paste0, end) 
# where code not in original dataset, write NA 
data2[!sapply(c(data2), '%in%', data$Code)] <- NA 
# else write the appropriate count 
data2[sapply(c(data2), '%in%', data$Code)] <- data$Count[order(data$Code)] 
# change column and row names 
colnames(data2) <- paste0(start, "x") 
rownames(data2) <- paste0("xx", end) 

但我猜dcast在LyzandeR的回答是更優雅。

相關問題