2016-07-20 4 views
0

私は先週、data.tableを使用し始めており、問題に直面しています。私はすでにherehereの解決策を見てきましたが、私の状況でどのように役立つかは完全にはわかりません。R data.tableのペーストを使用して、可変数の列をサブセット化してrowMeansを計算する

ここに私のサンプルデータがあります。

> dput(dt) 
structure(list(link = c(1L, 1L, 1L, 1L, 1L, 1L), id = c(8395, 8738, 9788, 9789, 9908, 9920), person = c(2937837, 3092435, 3511555, 3511555, 3568112, 3575082), seqid = c(11, 14, 9, 1, 7, 10), time = c(NA, NA, 25372, 50700, NA, NA), max = c(14, 31, 9, 7, 8, 11), hr = c(NA, NA, 7, 14, NA, NA), minhr = c(11, 19, 7, 14, 7, 16), maxhr = c(11, 19, 7, 14, 7, 16), TRAVELTIME0.1avg = c(59, 59, 59, 59, 59, 59), TRAVELTIME1.2avg = c(59, 59, 59, 59, 59, 59), TRAVELTIME2.3avg = c(59, 59, 59, 59, 59, 59), TRAVELTIME3.4avg = c(59.2079086331819, 59.2079086331819, 59.2079086331819, 59.2079086331819, 59.2079086331819, 59.2079086331819), TRAVELTIME4.5avg = c(59.9182362587214, 59.9182362587214, 59.9182362587214, 59.9182362587214, 59.9182362587214, 59.9182362587214), TRAVELTIME5.6avg = c(60.4905040124798, 60.4905040124798, 60.4905040124798, 60.4905040124798, 60.4905040124798, 60.4905040124798), TRAVELTIME6.7avg = c(59.2897529410742, 59.2897529410742, 59.2897529410742, 59.2897529410742, 59.2897529410742, 59.2897529410742), TRAVELTIME7.8avg = c(59.2717176535874, 59.2717176535874, 59.2717176535874, 59.2717176535874, 59.2717176535874, 59.2717176535874), TRAVELTIME8.9avg = c(59.2569737174023, 59.2569737174023, 59.2569737174023, 59.2569737174023, 59.2569737174023, 59.2569737174023), TRAVELTIME9.10avg = c(59.2814811928216, 59.2814811928216, 59.2814811928216, 59.2814811928216, 59.2814811928216, 59.2814811928216), TRAVELTIME10.11avg = c(59.2084537775537, 59.2084537775537, 59.2084537775537, 59.2084537775537, 59.2084537775537, 59.2084537775537), TRAVELTIME11.12avg = c(59.0915653550983, 59.0915653550983, 59.0915653550983, 59.0915653550983, 59.0915653550983, 59.0915653550983), TRAVELTIME12.13avg = c(59.6765035434587, 59.6765035434587, 59.6765035434587, 59.6765035434587, 59.6765035434587, 59.6765035434587), TRAVELTIME13.14avg = c(59.246760177185, 59.246760177185, 59.246760177185, 59.246760177185, 59.246760177185, 59.246760177185), TRAVELTIME14.15avg = c(59.4095339982924, 59.4095339982924, 59.4095339982924, 59.4095339982924, 59.4095339982924, 59.4095339982924), TRAVELTIME15.16avg = c(59.5347570536373, 59.5347570536373, 59.5347570536373, 59.5347570536373, 59.5347570536373, 59.5347570536373), TRAVELTIME16.17avg = c(59.3799872977671, 59.3799872977671, 59.3799872977671, 59.3799872977671, 59.3799872977671, 59.3799872977671), TRAVELTIME17.18avg = c(59.1915498629857, 59.1915498629857, 59.1915498629857, 59.1915498629857, 59.1915498629857, 59.1915498629857), TRAVELTIME18.19avg = c(59.1663574471712, 59.1663574471712, 59.1663574471712, 59.1663574471712, 59.1663574471712, 59.1663574471712), TRAVELTIME19.20avg = c(59.0217772215269, 59.0217772215269, 59.0217772215269, 59.0217772215269, 59.0217772215269, 59.0217772215269), TRAVELTIME20.21avg = c(59.0893371757925, 59.0893371757925, 59.0893371757925, 59.0893371757925, 59.0893371757925, 59.0893371757925), TRAVELTIME21.22avg = c(59.0272727272727, 59.0272727272727, 59.0272727272727, 59.0272727272727, 59.0272727272727, 59.0272727272727), TRAVELTIME22.23avg = c(59, 59, 59, 59, 59, 59), TRAVELTIME23.24avg = c(59, 59, 59, 59, 59, 59), TRAVELTIME24.25avg = c(59, 59, 59, 59, 59, 59), TRAVELTIME25.26avg = c(59, 59, 59, 59, 59, 59), TRAVELTIME26.27avg = c(59, 59, 59, 59, 59, 59)), .Names = c("link", "id", "person", "seqid", "time", "max", "hr", "minhr", "maxhr", "TRAVELTIME0.1avg", "TRAVELTIME1.2avg", "TRAVELTIME2.3avg", "TRAVELTIME3.4avg", "TRAVELTIME4.5avg", "TRAVELTIME5.6avg", "TRAVELTIME6.7avg", "TRAVELTIME7.8avg", "TRAVELTIME8.9avg", "TRAVELTIME9.10avg", "TRAVELTIME10.11avg", "TRAVELTIME11.12avg", "TRAVELTIME12.13avg", "TRAVELTIME13.14avg", "TRAVELTIME14.15avg", "TRAVELTIME15.16avg", "TRAVELTIME16.17avg", "TRAVELTIME17.18avg", "TRAVELTIME18.19avg", "TRAVELTIME19.20avg", "TRAVELTIME20.21avg", "TRAVELTIME21.22avg", "TRAVELTIME22.23avg", "TRAVELTIME23.24avg", "TRAVELTIME24.25avg", "TRAVELTIME25.26avg", "TRAVELTIME26.27avg"), sorted = "link", class = c("data.table", "data.frame"), row.names = c(NA, -6L)) 

アップデート1:あなたは上記のサンプルを使用してdtを作成した後dt <- data.table(dt)を行うinternal.selfrefの問題を回避するには。

私は移動時間をサブセットし、それらのサブセットの移動時間のためrowMeansを計算し、現在のDTに追加しminhrmaxhrに変数を使用したいです。 minhr(またはmaxhr)が11の場合、対応する旅行時間の列はTRAVELTIME11.12avgです。それが19の場合、対応する旅行時間の列はTRAVELTIME19.20avgです。だから、minhrは9とmaxhrが行のための10である場合、私はTRAVELTIME9.10avgTRAVELTIME10.11avgの平均値を取得する必要があります。 minhrは15とmaxhrある場合も同様に、17は、その後、私はTRAVELTIME15.16avgTRAVELTIME16.17avg、およびTRAVELTIME17.18avgの平均値を取得する必要があります。

問題を段階的に解決しようとしましたが、次のコードをすべての行に渡って単純な旅行時間列に使用しました。それはうまく動作します。

> dt[,avg:=rowMeans(.SD[,TRAVELTIME10.11avg:TRAVELTIME12.13avg, with=FALSE]),by=.(id, seqid)] 

次に、私は動的に列名を参照するためにpaste0()を導入することにより、上記のコードを変更しようとしました。しかし、これはエラーになります。さらに、私はas.symbol(paste0())noquote(paste0())を使用しようとしました。

1)ペーストコマンドを使用している場合、なぜdata.tableはとは対照的に、列をサブセット化)にも貼り付けた文字列をunquoting後(カラム名を認識しません。このことを考えると

> dt[,avg:=rowMeans(.SD[,paste0("TRAVELTIME", minhr, "." , minhr+1, "avg"):paste0("TRAVELTIME", maxhr, "." , maxhr+1, "avg"), with=FALSE]),by=.(id, seqid)] 

Error in paste0("TRAVELTIME", minhr, ".", minhr + 1, "avg"):paste0("TRAVELTIME", : 
    NA/NaN argument 
In addition: Warning messages: 
1: In eval(expr, envir, enclos) : NAs introduced by coercion 
2: In eval(expr, envir, enclos) : NAs introduced by coercion 

、私は2つの質問があります列名を直接使用していますか?すべての行に対して不等な列数とは何か関係がありますか?

2)私はうまくいかないので、各行の可変数の列を平均してdtに戻す方法を提案してください。提案が効率的な方法につながるのであれば、私は感謝しています。私はすでにこれを単純なループ方法で試しています。データのサイズには長い時間がかかります(私のデータセット全体で約12-15時間)。

答えて

1

私は、これはあなたがpaste0を持った問題を解決信じる:

tmp <- paste0("TRAVELTIME", dt$minhr, "." , dt$minhr+1, "avg") 
tmp1 <- paste0("TRAVELTIME", dt$maxhr, "." , dt$maxhr+1, "avg") 
dt1 <- dt[,avg:=rowMeans(.SD[,get(tmp):get(tmp1), with=FALSE]),by=.(dt$id, dt$seqid)] 

誰かが、おそらくあなたは厳密に最後の行で$が必要ですが、原因、問題の本質にしていないことを指摘します私はこれが問題の特定と解決に役立ったと感じていました。

+0

ご回答いただきありがとうございます。 internal.Selfrefポインタがなぜ報告されているのかわかりません。私は今それを削除しました。いずれにしても、あなたが提案したソリューションを採用し、平均旅行時間はすべての行で同じに見えます。このソリューションを使用して行間に異なる旅行時間があるかどうか確認してください。 – Gandalf

+0

@ガンダル 'internal.selfref'の問題のためにあなたのデータを複製できません(私がそれを取り出すと、私は集約をするときに別のエラーが出ます;それは変です)。私はこれが 'paste0'問題の問題を解決することを知っています。集約ロジックが正しくない場合は、それも修正する必要があります。条件文(if文の中に条件を入れるか、2つの異なる集計関数をデータの関連するサブセットに適用する)でそれを修正できると思います。 –

+0

あなたのコードが 'internal.selfref'の問題を解決する前に、' dt < - data.table(dt) 'を使うと思います。しかし、もっと重要なことに、私は上記のコードが私の問題を解決するとは思わない。ロジックは無傷だと思われますが、 'dt [、get(tmp):get(tmp1)、= FALSE]'を試してみると、* TRAVELTIME11という単一のベクトルが得られるので、 .12avg *。私の推測では、この問題は不等な列の結果です。しかし、私はそれを修正する方法を知らない。 – Gandalf

関連する問題