2016-11-01 3 views
0

Ich habe eine Liste von 244 Datenrahmen, die wie folgt aussieht: Der Name der Liste ist datas.Fehler bei der Verwendung von ifelse innerhalb muate innerhalb der for-Schleife

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 

Ich möchte eine neue Spalte fix.sal genannt machen, verschiedene Werte für verschiedene Jahre multipliziert wird. Zum Beispiel multipliziere ich 2 auf sal s, die in den gleichen Zeilen mit 2000 sind. Auf die gleiche Weise multipliziert die Zahl sal Wert 1,8 für 2005, 1,5 für 2010, 1,2 für 2013, 1 für 2015. Also das Ergebnis sollte wie folgt sein:

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 

I unter Verwendung ifelse innerhalb mutate des für Paket dplyr, dies zu tun gelungen.

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))))) 

Aber ich habe diese Operation zu dem 244 Datenrahmen in der Liste datas zu tun.

Also habe ich versucht, es mit der for-Schleife so zu tun;

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))))) 
} 

Dann kam ein Fehler;

Error: invalid subscript type 'integer' 

Wie kann ich das lösen ...?

Alle Kommentare werden sehr geschätzt! :)

Antwort

3

Bitte zwingen Sie sich nicht, ifelse dafür zu verwenden. Erstellen Sie stattdessen einen Vektor mit Ihren Multiplikatoren, und verwenden Sie dann das Jahr, um aus dem Vektor auszuwählen. Der Vektor wird wie folgt aussehen:

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

Mit was auch immer Ihrem Multiplikator für jedes Jahr in Ihren Daten. Dann ist hier einige Beispieldaten (alle gleich, aber das spielt keine Rolle):

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

Schließlich können wir dann lapply zur Schleife verwenden, um durch die Liste effizienter zu gestalten. Jedes Mal verwendet es die Year, um einen Wert aus dem multipliers-Vektor auszuwählen (beachten Sie die Verwendung von as.character, andernfalls wird es beispielsweise den 2005. Eintrag anstelle des einen namens "2005" auswählen).

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

kehrt:

[[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 

Für kompakten Code können Sie verwenden:

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

aber das macht es etwas weniger mich klar, was geschieht.

+0

Vielen Dank ...! Ich habe es gelöst :) – min

0

Hier ist eine einfache Lösung ifelse und lapply mit:

# 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) 
}) 

Sie finden das Ergebnis für jede df in der Liste erhalten.

Verwandte Themen