2017-05-30 7 views
0

前の2つの列のn個の値を計算していくつかの新しい列を作成しようとしています。複数の列の前のn個のインスタンスの加重平均を計算する

Autoを使用している例。だから、80,81,82カローラの(重量、HPは)だった

library(ISLR) 
library(dplyr)  
LaggedAuto <- Auto %>% 
        arrange(year) %>% 
        group_by(name) %>% 
        mutate(L2HPbyWT = 1000*((lag(horsepower)+lag(horsepower,2))/(lag(weight)+lag(weight,2)))) 

(2265、75)、(2350年:私は前の二つのモデル年のため1000lbsあたりの平均馬力を算出し、列を作りました、75)、(2245,70)。したがって、Corolla '82行の新しい列は1000*(75+75)/(2265+2350) = 32.50になります。だから、平均値はHP/Weightで、重みはWeightです。

私の独自のデータセットには、約12列ありますが、これは5時間遅れで行います。これは、現在のテクニックを続けると、11個の変数に対して多くのタイピング(lag(、1)+ lag(2)+ ... + lag(、5))を実行することになります更新/調整。異なった遅れのための複数の変数のこの種の遅れた加重計算を簡単な方法で実行する方法がありますか?

以前の私の質問と見つけた別の質問に基づいてzoo :: rollaplyrを使用したいと感じましたが(Mutate multiple/consecutive columns (with dplyr or base R))、機能が何であるかを決定する問題があります。この例にとどめるために、MPGdisplacementaccelerationの最後の2つのインスタンスの平均を1000lbsで計算する方法を理解できますかweight

答えて

0

まず、私たちが使用できるように、データの出所を明記してください。 library(ISLR)の下に見つかりました。

私はstats :: lag関数が嫌いです。ラグ関数からの遅れた値の追加には問題があります。

lag(Auto$horsepower[1:8], 1) 
#[1] 130 165 150 150 140 198 220 215 
#attr(,"tsp") 
#[1] 0 7 1 

lag(Auto$horsepower[1:8], 2) 
#[1] 130 165 150 150 140 198 220 215 
#attr(,"tsp") 
#[1] -1 6 1 

lag(Auto$horsepower[1:8], 1) + lag(Auto$horsepower[1:8], 2) 
#[1] 260 330 300 300 280 396 440 430 
#attr(,"tsp") 
#[1] 0 7 1 

これは動作しません:私は何を意味するかを紹介します。データを正しくサブセット化する手段を提供しますが、実際には使用できません。これは、リードとラグの両方のために誰かの人生を容易にするために、完璧なベクトル化機能となり

shift(Auto$horsepower[1:8], 1:2) 
#  [,1] [,2] 
#[1,] 0 0 
#[2,] 130 0 
#[3,] 165 130 
#[4,] 150 165 
#[5,] 150 150 
#[6,] 140 150 
#[7,] 198 140 

rowSums(shift(Auto$horsepower[1:8], 1:2)) 
#[1] 0 130 295 315 300 290 338 418 

:何が本当にしたいことのようなものです。 ので、私は以下のことを書きました:今、あなたは簡単に先に行くとしてあなたのコードを修正することができます

shift <- function(x, i = 1, NA2zero = TRUE, naming = NULL){ 
    Z <- ifelse(NA2zero, 0, NA) 
    L <- sapply(i, function(i){ "if"(i > 0, 
            c(rep(Z, max(abs(i))), 
             x[-c((length(x)+1-i):length(x))]), 
            "if"(i < 0, 
              c(x[-c(1:abs(i))], 
               rep(Z, max(abs(i)))), 
              x)) 
       }) 
    "if"(is.null(naming), 
     colnames(L) <- paste0(deparse(substitute(x)),".",i), 
     colnames(L) <- paste0(naming,".",i)) 
    return(L) 
} 

head(shift(Auto$horsepower, 0:2, naming = "HP"),3) 
    HP.0 HP.1 HP.2 
[1,] 130 0 0 
[2,] 165 130 0 
[3,] 150 165 130 

L2HPbyWT = 1000*((rowSums(shift(Auto$horsepower, i = 1:2))/rowSums(shift(Auto$weight, i = 1:2)))) 

私も楽しい小さな命名機能を追加しました編集:それは、あなたがラグ関数afterallを必要としなかったようです! 今質問にお答えします。私はdplyrに入ったことがないので、これがベースになるので、私を許してください。あなたは車の別の年に遅れているようです。だから我々は車を見て: dim(自動) #[1] 392 9#かなり大きい、たくさんの行。

# split them into groups by type of car 
eachAuto <- split(Auto, Auto$name) 
table(sapply(eachAuto, nrow)) 
# 0 1 2 3 4 5 # lengths 
# 3 245 34 12 7 3 # counts 

今はそうで0行(データがないいくつかの因子レベルが存在する)、1つだけの行と245台の車、3行12台の自動車、との3台の車があることがわかり。

ここでは名前列を使用するのは間違いです...使用できる車を制限しない限りですか? 方法について:あなたは正確にだけ遅れのために利用可能な車を使用している今

MAXLAG <- 2 
Autos_subset <- eachAuto[sapply(eachAuto, nrow) > (MAXLAG-1)] 
newAuto <- lapply(Autos_subset, function(x) { 
    x$L2HPbyWT <- 1000*((rowSums(shift(x$horsepower, i = 1:MAXLAG))/rowSums(shift(x$weight, i = 1:MAXLAG)))) 
    x 
    }) 

length(newAuto) # 56 car names in the list 

。私が非常に良いかもしれないので、マークを紛失しているかどうか私に教えてください。

+0

助けてくれてありがとう!私はそれがベースにあると思った、それはISLRにあったことを認識していなかった。また、私が使っている 'lag'はdpylr(stats :: lagがあったことさえ知りませんでした)なので、 ' lag(Auto $ horsepower [1:8]、1)+ lag(Auto $ 2)「 」は、所望により 「NA NA 295 315 300 290 338 418」となる。私はあなたのコードをチェックアウトします! – CoolGuyHasChillDay

+0

自分のコードを修正しました!今より良いはずです。 –

+0

よかったよ、ありがとう!私の前のコメントを読んでしまった?私が使用している '遅れ'は、 'stat'ではなく' dplyr'を通っているので、あなたのものと同じように動作しますが、私のコードではモデルと年ごとに分割することができます。 Re:「非時系列データに対する遅れのポイント」とは、時系列とは車のモデル(年の2桁の数字)です。私の元のコードは、まさにそれを行う必要があります、私は15 +の列のためにそれを行う必要があります。これを手動で行うのは問題ありませんが、私の元の質問は、それが複数の列にわたって繰り返されるかどうかを尋ねることでした。 – CoolGuyHasChillDay

関連する問題