【发布时间】: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 %>% arrange(CampaignName) %>% filter(Status!="Paused") -
你能
dput你的数据吗? -
在 R 中尽可能避免 for 循环。即使 apply 系列也有内部循环,并且错过了 R 能够实现的并行操作的大部分优势。阅读此 www.burns-stat.com/pages/Tutor/R_inferno.pdf。您会因不必要的循环而陷入第 3 圈,而使用 rbind 会陷入不断增长的对象的第 2 圈。