2015-06-18 2 views
0

Я начинаю программировать на R (я только что закончил курс Coursera), и мне не удается создать этот вложенный цикл.R: Вложенная сортировка

У меня есть 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 
} 
+0

Поскольку R является интерпретируемым языком, вы можете выполнить код построчно. Это должно позволить вам найти строку, которая выдает ошибку. Примечание на стороне: вы должны попытаться опубликовать воспроизводимый код в Stackoverflow. – cryo111

+1

Попробуйте 'library (dplyr); ds%>% arr (CampaignName)%>% filter (Status! = "Paused") ' – Khashaa

+0

вы можете' dput' ваши данные? – Hav0k

ответ

0

dplyr и magrittr пакетов в R превосходны при обработке такого рода вопросов. В частности, функция организовать в dplyr позволяет расположить строки, а функция фильтра в dplyr позволяет удалять строки:

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

В базе R я хотел бы использовать следующие две строки кода. Первый - упорядочение, второе - подмножество. Существует, конечно, способ, чтобы обернуть его в Oneliner, но я думаю, что это более читаемым, как это:

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 
Смежные вопросы