在for循环中使用ifelse inside mutate时出错

在for循环中使用ifelse inside mutate时出错,r,if-statement,for-loop,dplyr,R,If Statement,For Loop,Dplyr,我有一个244个数据帧的列表,如下所示: 列表的名称是datas 我想创建一个名为fix.sal的新列,将不同年份的不同值相乘。例如,我在与2000位于同一行的SAL上乘以2。同样,sal值乘以的数字2005年为1.8,2010年为1.5,2013年为1.2,2015年为1。所以结果应该是这样的: Year sal fix.sal 2000 10000 20000 2000 15000 30000 2005 10000 18000 2005 9000 16200 2005 1200

我有一个244个数据帧的列表,如下所示: 列表的名称是datas

我想创建一个名为fix.sal的新列,将不同年份的不同值相乘。例如,我在与2000位于同一行的SAL上乘以2。同样,sal值乘以的数字2005年为1.8,2010年为1.5,2013年为1.2,2015年为1。所以结果应该是这样的:

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
multiplier <-
  c("2005" = 1.2
    , "2006" = 1.05
    , "2007" = 0.9)
通过在包dplyr中使用ifelse-insidemutate,我成功地做到了这一点

然后出现了一个错误

Error: invalid subscript type 'integer'
我怎样才能解决这个问题


如有任何意见,将不胜感激!:

请不要强迫自己使用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
multiplier <-
  c("2005" = 1.2
    , "2006" = 1.05
    , "2007" = 0.9)
返回:

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

但这让我对发生的事情不太清楚。

请不要强迫自己使用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
multiplier <-
  c("2005" = 1.2
    , "2006" = 1.05
    , "2007" = 0.9)
返回:

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

但这让我对正在发生的事情不太清楚。

这里有一个使用ifelse和lappy的简单解决方案:

# 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的结果。

下面是一个使用ifelse和LAPPY的简单解决方案:

# 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的结果