【问题标题】:R: Nested SortingR:嵌套排序
【发布时间】:2015-06-18 16:24:37
【问题描述】:

我是 R 编程的初学者(我刚刚完成 Coursera 课程),但在创建这个嵌套循环时遇到了麻烦。

我有一个这样结构的 csv(实际上有 108 列):

 Type     Status  Campaign Name    Group      Budget  Budget Type    Bids
 Campaign Active    Burritos                   500      Daily   
 Campaign Active    Tacos                      400      Daily   
 Group    Active    Burritos    Bean Burritos                         0.5
 Group    Active    Burritos    Beef Burritos                         0.5
 Group    Paused    Burritos    Chicken Burritos                      0.5
 Group    Active    Tacos       Beef Tacos                            0.5
 Group    Active    Tacos       Chicken Tacos                         0.5
 Group    Paused    Tacos       Fish Tacos                            0.5

我想按广告系列名称重新排序表格,然后暂停分组删除:

 Type     Status  Campaign Name    Group      Budget  Budget Type     Bids
 Campaign Active    Burritos                    500     Daily   
 Group    Active    Burritos    Bean Burritos                         0.5
 Group    Active    Burritos    Beef Burritos                         0.5
 Campaign Active    Tacos                       400     Daily   
 Group    Active    Tacos       Beef Tacos                            0.5
 Group    Active    Tacos       Chicken Tacos                         0.5

我打算使用一系列 For 循环,但我一直遇到错误。我很确定 rbind 有错误。另外,当我创建 temp.ds 和 temp.group.ds 时,我认为有错误。也可能是循环中的错误。

下面是我的代码:

ds <- do.call(rbind, lapply(list.files(path=directory, full.names=TRUE), read.table, header=TRUE, sep="\t", fileEncoding="UTF-16LE", fill = TRUE, quote = ""))

valid.campaign <- ds[ which(ds$Status == "Active" & ds$Type == "Campaign"), ]

new.ds <- NULL 

for(campaign in valid.campaign$Type) {
  temp.ds <- valid.campaign[,campaign]
  valid.group <- ds[ which(ds$Status == "Active" & ds$Type == "Group"), ]  

  for (group in valid.group$Type) {
    temp.group.ds <- valid.group[,group]
    temp.ds <-rbind(temp.ds, temp.group.ds)
    rm(temp.group.ds)
    }

  if (exists("new.ds")) new.ds <- rbind(new.ds,temp.ds)
  else new.ds <- temp.ds
  rm(temp.ds)
  }
new.ds 
}

【问题讨论】:

  • 由于 R 是一种解释型语言,您可以逐行执行代码。这应该使您能够找到引发错误的行。附注:您应该尝试在 Stackoverflow 上发布可重现的代码。
  • 试试library(dplyr); ds %&gt;% arrange(CampaignName) %&gt;% filter(Status!="Paused")
  • 你能dput你的数据吗?
  • 在 R 中尽可能避免 for 循环。即使 apply 系列也有内部循环,并且错过了 R 能够实现的并行操作的大部分优势。阅读此 www.burns-stat.com/pages/Tutor/R_inferno.pdf。您会因不必要的循环而陷入第 3 圈,而使用 rbind 会陷入不断增长的对象的第 2 圈。

标签: r loops for-loop rbind


【解决方案1】:

R 中的 dplyr 和 magrittr 包非常擅长处理这类问题。具体来说,dplyr 中的排列功能允许您排列行,而 dplyr 中的过滤功能允许您删除行:

ds %<>% arrange(CampaignName, Group)  %>% filter(Status != 'Paused')

【讨论】:

    【解决方案2】:

    在基础R 中,我将使用以下两行代码。第一个做排序,第二个做子集。当然有一种方法可以将它包装在一个单行中,但我认为这样更具可读性:

    ds = ds[order(ds$Campaign_Name, ds$Group),]
    ds = ds[which(ds$Status != "Paused"),]
    

    给我们:

          Type Status Campaign_Name         Group Budget Budget_Type Bids
    1 Campaign Active      Burritos                  500    Daily      NA
    3    Group Active      Burritos Bean Burritos     NA              0.5
    4    Group Active      Burritos Beef Burritos     NA              0.5
    2 Campaign Active         Tacos                  400    Daily      NA
    6    Group Active         Tacos    Beef Tacos     NA              0.5
    7    Group Active         Tacos Chicken Tacos     NA              0.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-28
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2014-08-29
      • 2011-02-18
      • 2017-08-01
      相关资源
      最近更新 更多