2013-11-24 1 views
0

У меня есть список акций в индексе, отсортированном по дате, и я пытаюсь удалить все строки, в которых предыдущая строка имеет один и тот же код запаса. Это даст данные о начальном индексе и всех датах, когда произошел сбой в индексеудаление дубликатов подмножеств строк

В моем рабочем примере я буду использовать имена вместо столбца даты и некоторые числа.

Сначала я думал, что я мог бы удалить строки, используя подмножество() и! Дублируется

name <- c("Joe","Mary","Sue","Frank","Carol","Bob","Kate","Jay") 
num <- c(1,2,2,1,2,2,2,3) 
num2 <- c(1,1,1,1,1,1,1,1) 
df <- data.frame(name,num,num2) 
dfnew <- subset(df, !duplicated(df[,2])) 

Однако, это может не сработать в том случае, когда запас удаляется из списка, а затем позже заменен , Итак, в моем рабочем примере желаемым результатом являются строки Джо, Мэри, Фрэнка, Кэрол и Джей.

Далее я создал функцию, чтобы узнать, изменяется ли индекс. Входной сигнал функции номер строки:

#------ function to tell if there is a change in the row subset-----# 
df2 <- as.matrix(df) 
ChangeDay <- function(x){ 
     Current <- df2[x,2:3]     
    Prev <- df2[x-1,2:3] 
    if (length(Current) != length(Prev)) 
     NewList <- true 
    else 
     NewList <- length(which(Current==Prev))!=length(Current) 
    return(NewList) 
} 

Наконец, я пытаюсь создать петлю, чтобы удалить нужные строки. Я новичок в программировании, и я борюсь с циклами. Я не уверен, что лучший способ - предварительно выделить память, когда размеры моего окончательного вывода неизвестны. Все книги, на которые я смотрел, дают только тривиальные примеры циклов. Вот моя последняя попытка:

result <- matrix(data=NA,nrow=nrow(df2),ncol=3) #pre allocate memory 
tmp <- as.numeric(df2) #store the original data 
changes <- 1 
for (i in 2:nrow(df2)){ #always keep row 1, thus the loop starts at row 2 

    if(ChangeDay(i)==TRUE){ 

    result[i,] <-tmp[i]  #store the row in result if ChangeDay(i)==TRUE 
    changes <- changes + 1 #increment counter 
    } 
} 
result <- result[1:changes,] 

Thansk за вашу помощь и любые дополнительные общие рекомендации по циклам оцениваются!

+0

общий совет, я бы рекомендовал прочитать R инферно http://www.burns-stat.com/pages/Tutor/R_inferno.pdf – rawr

+0

Для меня при первом запуске с программированием в R, я думал, что петли - легкая часть. Это был просто логичный способ сделать то, что мне нужно, без огромного знания встроенных функций в R. С тех пор я взял опыт работы со всеми различными функциями и трюками, которые делают все быстрее. Функции более абстрактны, чем цикл for, поэтому для этого потребуется некоторое время. Это, как говорится, я все еще не сильный программист и полагаюсь на петли больше, чем я, вероятно, должен. Но пока вы держите это в себе, люди здесь не будут судить вас;) (только наполовину шутя) – rawr

+0

также, я не совсем уверен, чего вы хотите от двух других кусков кода. – rawr

ответ

0

Непонятно, что вы хотите сделать. Но я думаю:

df[c(1,diff(df$num)) !=0,] 
    name num num2 
1 Joe 1 1 
2 Mary 2 1 
4 Frank 1 1 
5 Carol 2 1 
8 Jay 3 1 
+0

Это разрешило рабочий пример. Мои реальные данные имеют более 100 столбцов, поэтому я пытаюсь понять и обобщить то, что вы сделали. Похоже, что «1» сохраняет первую строку, а функция diff удаляет строки, которые я хочу удалить. Я попробовал df [c (1, diff (df [c (2: 3),])! = 0,], чтобы попытаться расширить функцию diff до нескольких столбцов, но я получаю сообщение об ошибке. Ошибка: неожиданный ']' in " ДФ ..... – lever