1

非常に非効率的な方法でコーディングしたタスクを改善するためのアイデア/機能を探しています。

元のデータ フレームは次のようになります。

        CUSIP       Date        Pclose  TRI
1       30161N101   2011-01-03  38.8581 2011-01-03
2       06738G878   2011-01-03  48.4040 2011-01-03
3       74339G101   2011-01-03  24.0880 2011-01-03
4       74348A590   2011-01-03  81.7200 2011-01-03
5       26922W109   2011-01-03  87.8700 2011-01-03
...

列「TRI」には、日付形式の日付が含まれています。

そして、私が取得したいものは次のようになります:

    Date        233052109   126650100   251566105   149123101 ...
1   2011-01-03  22.8031     34.3034     11.2645      91.6178
2   2011-01-04  22.6843     34.2740     11.1862      91.1897
3   2011-01-05  22.7933     34.6362     10.9948      91.9779
4   2011-01-06  22.8034     34.2838     11.0470      91.0242
5   2011-01-07  22.6248     34.3034     11.0644      91.2091
.
.
.

2 番目のデータ フレームでは、各列 (日付を除く) は最初のデータ フレームからの CUSIP の名前を持ち、Pclose からのデータで埋められます。

通常のループで2番目のデータフレームを作成していますが、コンパイルされた関数を使用してより良い方法を実行する方法があると確信しています(おそらくサブセット)

私の機能は次のとおりです。

2 番目のデータ フレームを作成するには:

function(cusippresent,cusiplist){
    workinglist=list()
    workinglist[1]=as.character('Date')
    position = 2
    for (i in 2:length(cusippresent)) {
        if(cusippresent[i] %in% cusiplist) {
            workinglist[position]=as.character(cusippresent[i]);
            position=position+1
        }
    }

    rm(position)

    Data=data.frame()

    #On remplit la première ligne du dataframe
    #avec des éléments du bon type sinon il y a des problèmes

    Data[1,1]=as.character('1987-11-12')

    Data[1,2]=as.numeric(1)
    for (i in 2:length(workinglist)){Data[1,i]=as.numeric(1)}
    for (i in 1:length(workinglist)){colnames(Data)[i]=workinglist[i]}

    return(Data)    
}

データ フレームを埋めるには:

function(DATA11C,TCusipC){
    nloop = 1
    positionorigine = 1
    positioncible = 1

    #copy of dates
    datelist = DATA11C[,"Date"]
    datelist = unique(datelist)
    for (i in 1:length(datelist)) {
        TCusipC[i,"Date"]=as.character(datelist[i])
    }

    #creation of needed columns
    TCusipC[,ncol(TCusipC)+1] = as.Date(TCusipC[,"Date"])
    colnames(TCusipC)[ncol(TCusipC)] = 'TRI'

    #ordering of tables
    DATA11C=DATA11C[with(DATA11C,order(TRI)),]
    TCusipC=TCusipC[with(TCusipC,order(TRI)),]

    longueur = nrow(TCusipC)

    #filling of the table 
    while(nloop<longueur) {
        while(DATA11C[positionorigine,"TRI"]==TCusipC[positioncible,"TRI"]){
            nom = as.character(DATA11C[positionorigine,"CUSIP"]);
            TCusipC[positioncible,nom]=as.numeric(DATA11C[positionorigine,"Pclose"]);
            positionorigine=positionorigine+1
        };
        nloop=nloop+1;
        positioncible=positioncible+1
    }

    return(TCusipC)
}

どの機能を掘り下げるかについて何か提案はありますか? 潜在的な改善?

どうもありがとう、

ヴィンセント

4

2 に答える 2

2

それはまさに reshape パッケージが行うことです

library(reshape)
cast(Date ~ CUSIP, data = DATA11C, value = "Pclose")
于 2012-06-20T07:51:11.237 に答える
0

ベース R のソリューションは次のreshape()とおりです。

dat = read.table(header=TRUE, text="        CUSIP       Date        Pclose  TRI
1       30161N101   2011-01-03  38.8581 2011-01-03
2       06738G878   2011-01-03  48.4040 2011-01-03
3       74339G101   2011-01-03  24.0880 2011-01-03
4       74348A590   2011-01-03  81.7200 2011-01-03
5       26922W109   2011-01-03  87.8700 2011-01-03")
reshaped.dat = reshape(dat, direction="wide", 
                       timevar="CUSIP", idvar="Date", 
                       drop="TRI")
names(reshaped.dat) = gsub("Pclose.", "", names(reshaped.dat))

出力:

reshaped.dat
#         Date 30161N101 06738G878 74339G101 74348A590 26922W109
# 1 2011-01-03   38.8581    48.404    24.088     81.72     87.87

更新:xtabs()アプローチ

これは、次を使用して非常に簡単に実現できますxtabs()

xtabs(Pclose ~ Date + CUSIP, dat)
#             CUSIP
# Date         06738G878 26922W109 30161N101 74339G101 74348A590
#   2011-01-03   48.4040   87.8700   38.8581   24.0880   81.7200

as.data.frame.matrix(xtabs(Pclose ~ Date + CUSIP, dat))
#            06738G878 26922W109 30161N101 74339G101 74348A590
# 2011-01-03    48.404     87.87   38.8581    24.088     81.72
于 2012-06-20T08:46:43.240 に答える