2016-11-01 3 views
0

다음과 같은 244 데이터 프레임 목록이 있습니다. 목록의 이름은 datas입니다.for 루프 내에서 ifelse 내부 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에 대한 mutate 내부 ifelse를 사용하여이 작업을 수행하는 데 성공

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

당신은 목록 내 각 안양의 결과를 얻을 수 있습니다.

관련 문제