【问题标题】:apply similar variable to multiple dataset in r将类似的变量应用于 r 中的多个数据集
【发布时间】:2018-05-22 20:57:04
【问题描述】:

我有 6 个从 dat1 到 dat6 的数据,我想添加变量区域并以类似的方式标记它们,如下所示:

dat1$region <- paste("NE-1")
dat2$region <- paste("NE-2")
dat3$region <- paste("NE-3")
dat4$region <- paste("NE-4")
dat5$region <- paste("NE-5")

如何以更简洁的方式编写此代码?使用applyfor-loop? 谢谢!!

【问题讨论】:

    标签: r for-loop apply


    【解决方案1】:

    一种选择是在for-loop 中使用getassign 函数。

    样本数据:

    dat1 <- data.frame(id=1:4, region = letters[1:4])
    dat2 <- data.frame(id=5:8, region = letters[5:8])
    dat3 <- data.frame(id=9:12, region = letters[9:12])
    dat4 <- data.frame(id=13:16, region = letters[13:16])
    dat5 <- data.frame(id=17:20, region = letters[17:20])
    
    dat1
    #   id region
    # 1  1      a
    # 2  2      b
    # 3  3      c
    # 4  4      d
    

    申请for-loop:

    for(i in 1:5){
      name = paste("dat",i,sep="")
      temp <- get(name)
      temp$region = paste("NE",i,sep = "-")
      assign(name, temp)
    }
    

    验证结果:

    dat1
    #   id region
    # 1  1   NE-1
    # 2  2   NE-1
    # 3  3   NE-1
    # 4  4   NE-1
    
    
    dat5
    #   id region
    # 1 17   NE-5
    # 2 18   NE-5
    # 3 19   NE-5
    # 4 20   NE-5
    

    【讨论】:

      【解决方案2】:

      将所有数据帧保存在一个列表中,然后使用lapply

      # example dataframes
      dat1 <- cars[1:2, ]
      dat2 <- cars[3:4, ]
      dat3 <- cars[5:6, ]
      
      myList <- list(dat1, dat2, dat3)
      # myList 
      # [[1]]
      #   speed dist
      # 1     4    2
      # 2     4   10
      # 
      # [[2]]
      #   speed dist
      # 3     7    4
      # 4     7   22
      # 
      # [[3]]
      #   speed dist
      # 5     8   16
      # 6     9   10
      

      那么做重复操作就容易多了。循环遍历列表,添加 region 列:

      res <- lapply(seq_along(myList), function(i){
        x <- myList[[ i ]]
        x$region <- paste0("NE-", i)
        x
      })
      
      res
      # [[1]]
      #   speed dist region
      # 1     4    2   NE-1
      # 2     4   10   NE-1
      # 
      # [[2]]
      #   speed dist region
      # 3     7    4   NE-2
      # 4     7   22   NE-2
      # 
      # [[3]]
      #   speed dist region
      # 5     8   16   NE-3
      # 6     9   10   NE-3
      

      【讨论】:

        【解决方案3】:

        怎么样(假设您的所有项目都以dat 开头并以唯一标识符字符串结尾):

        dat_names <- ls()[grepl("^dat", ls())]
        dat_ID <- sapply(dat_names, function(d) gsub("dat", "", d))
        for(d in 1:length(dat_names)) {
          dat_names[[d]]$region <- paste("NE-", dat_ID[d], sep="")
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-29
          • 1970-01-01
          • 2017-01-18
          • 1970-01-01
          • 2011-02-17
          • 1970-01-01
          • 2020-02-25
          • 1970-01-01
          相关资源
          最近更新 更多