【问题标题】:Got an error using ifelse inside mutate inside the for loop在 for 循环中使用 ifelse 内部 mutate 时出错
【发布时间】:2016-11-01 16:02:52
【问题描述】:

我有一个包含 244 个数据框的列表,如下所示: 列表名称为datas

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 位于同一行的 sals 上乘以 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

我通过在 mutate 中使用 ifelse 成功地做到了这一点,这用于包 dplyr

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'

我该如何解决这个问题...?

任何 cmets 将不胜感激! :)

【问题讨论】:

    标签: r if-statement for-loop dplyr


    【解决方案1】:

    请不要强迫自己为此使用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 更有效地循环列表。每次通过时,它使用Yearmultipliers 向量中选择一个值(注意使用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)])
    

    但这让我不太清楚发生了什么。

    【讨论】:

      【解决方案2】:

      这是一个使用 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 的结果。

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2020-01-11
        • 2016-10-15
        相关资源
        最近更新 更多