我把它用reshape()
的工作,但它的醜陋:
input <- 'stock1,time1,price1,time2,price2,time3,price3\nstock1,time4,price4\nstock2,time1,price1,time2,price2\nstock2,time3,price3\n';
df <- read.csv(text=input,header=F,stringsAsFactors=F); ## replace text=input with file name
subset(setNames(reshape(df,idvar='V1',dir='l',varying=lapply(2:3,seq,ncol(df),by=2L),new.row.names=seq_len(prod(dim(df))))[-2L],c('stock','time','price')),time!='');
## stock time price
## 1 stock1 time1 price1
## 2 stock1 time4 price4
## 3 stock2 time1 price1
## 4 stock2 time3 price3
## 5 stock1 time2 price2
## 7 stock2 time2 price2
## 9 stock1 time3 price3
注:
- 從廣角到長格式去時,將
varying
參數必須指定一組寬列集必須在結果框架中堆疊成長列。如果存在多個這樣的寬列集合,則參數值必須是列表,其中每個組件都是設置爲堆棧的寬列的規範。我用lapply()
簡明特技爲每個time
和price
寬列集的運行seq()
一次,傳遞給它起始列作爲第一個參數from
(2L
爲time
和3L
爲price
),然後ncol(df)
爲to
和2L
作爲by
,它產生所需的列表值。
- 的
new.row.names
參數是必須的,因爲輸入數據在idvar
(股票)列有重複,不幸的是,儘管reshape()
的算法,從廣角到長格式轉換時重複的ID工作,它搶從勝利的下巴失利通過嘗試在結果框上設置行名,由於重複而失敗。我首先嚐試指定NULL
作爲參數值,希望能夠防止完全設置行名,但它沒有效果;因此,我們需要計算一個唯一行名稱的實際向量以保持它的快樂,並且該向量必須足夠長才能覆蓋結果框架。我認爲seq_len(prod(dim(df)))
是保證充分性的合理解決方案。
預期產量是多少? – akrun
我編輯了我的上述帖子以包含所需的輸出結構。希望澄清。 – abvmk3