2016-11-01 8 views
0

私は次のような244データフレームのリストを持っています: リストの名前はdatasです。forループ内のifelse inside mutateを使用してエラーが発生しました

datas[[1]] 

year sal 
2000 10000 
2000 15000 
2005 10000 
2005 9000 
2005 12000 
2010 15000 
2010 12000 
2010 20000 
2013 25000 
2013 15000 
2015 20000 

私は別の年のために異なる値を乗じ、fix.salと呼ばれる新しい列を作成したいと思います。たとえば、2000と同じ行にあるsalの2を乗算します。同じように、salの値に乗算された数値は、2005年には1.8、2010には1.5、2013には1.2、2015には1です。このようにする必要があります:私はどのパッケージdplyrためmutateifelseを使用することにより、これを行うことに成功した

Year sal fix.sal 
2000 10000 20000 
2000 15000 30000 
2005 10000 18000 
2005 9000 16200 
2005 12000 21600 
2010 15000 22500 
2010 12000 18000 
2010 20000 30000 
2013 25000 30000 
2013 15000 18000 
2015 20000 20000 

library(dplyr) 
datas[[1]]<-mutate(datas[[1]], fix.sal= 
ifelse(datas[[1]]$Year==2000,datas[[1]]$sal*2, 
ifelse(datas[[1]]$Year==2005,datas[[1]]$sal*1.8, 
ifelse(datas[[1]]$Year==2010,datas[[1]]$sal*1.5, 
ifelse(datas[[1]]$Year==2013,datas[[1]]$sal*1.2, 
datas[[1]]$sal*1))))) 

しかし、私は、リストdatas 244枚のデータフレームに、この操作を行う必要があります。

だから私はこのようなforループを使ってやろうとしました。

for(i in 1:244){ 
datas[[i]]<-mutate(datas[[i]], fix.sal= 
    ifelse(datas[[i]]$Year==2000,datas[[i]]$sal*2, 
    ifelse(datas[[i]]$Year==2005,datas[[i]]$sal*1.8, 
    ifelse(datas[[i]]$Year==2010,datas[[i]]$sal*1.5, 
    ifelse(datas[[i]]$Year==2013,datas[[i]]$sal*1.2, 
    datas[[i]]$sal*1))))) 
} 

エラーが発生しました。

Error: invalid subscript type 'integer' 

どうすればこの問題を解決できますか?

すべてのコメントをいただければ幸いです! :)

答えて

3

これにはifelseを強制的に使用しないでください。代わりに、乗数でベクトルを作成し、ベクトルから選択するために年を使用します。ベクトルは次のようになります。

multiplier <- 
    c("2005" = 1.2 
    , "2006" = 1.05 
    , "2007" = 0.9) 

あなたのデータには、あなたの乗数が何であっても。次に、ここではいくつかのサンプルデータは、(すべて同じ、それは問題ではありません)です:

datas <- 
    lapply(1:3, function(idx){ 
    data.frame(
     Year = 2005:2007 
     , sal = c(10, 20, 30) 
    ) 
    }) 

最後に、我々は、より効率的にリストをループするlapplyを使用することができます。毎回Yearを使用してmultipliersベクターの値を選択します(as.characterの使用に注意してください。そうでない場合は、「2005」という名前ではなく2005番目の項目が選択されます)。

lapply(datas, function(x){ 
    mutate(x, fix.sal = sal*multiplier[as.character(Year)]) 
}) 

リターン:よりコンパクトなコードの場合

[[1]] 
    Year sal fix.sal 
1 2005 10  12 
2 2006 20  21 
3 2007 30  27 

[[2]] 
    Year sal fix.sal 
1 2005 10  12 
2 2006 20  21 
3 2007 30  27 

[[3]] 
    Year sal fix.sal 
1 2005 10  12 
2 2006 20  21 
3 2007 30  27 

、あなたが使用することができます。

lapply(datas, mutate, fix.sal = sal*multiplier[as.character(Year)]) 

が、それは何が起こっているのか私にはそれがわずかに少ない明らかになります。

+0

ありがとうございます...!私はそれを解決した:) – min

0

ここifelseとlapply使用した簡単なソリューションです:

# Creating the list 
df <- data.frame(year=c(rep(2000,2),rep(2005,3),rep(2010,3),rep(2013,2),2015), 
       sal=c(10000,15000,10000,9000,12000,15000,12000,20000,25000,15000,20000)) 

datas <- list(df,df) 

# Applying the function with ifelse 
lapply(datas,function(x){ 
    outp <- ifelse(df$year==2000,df$sal*2, 
     ifelse(df$year==2005,df$sal*1.8, 
       ifelse(df$year==2010,df$sal*1.5, 
         ifelse(df$year==2013,df$sal*1.2,df$sal*1)))) 

    return(outp) 
}) 

あなたは、リスト内の各DFのための結果を得るでしょう。

関連する問題