У меня есть список акций в индексе, отсортированном по дате, и я пытаюсь удалить все строки, в которых предыдущая строка имеет один и тот же код запаса. Это даст данные о начальном индексе и всех датах, когда произошел сбой в индексеудаление дубликатов подмножеств строк
В моем рабочем примере я буду использовать имена вместо столбца даты и некоторые числа.
Сначала я думал, что я мог бы удалить строки, используя подмножество() и! Дублируется
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 за вашу помощь и любые дополнительные общие рекомендации по циклам оцениваются!
общий совет, я бы рекомендовал прочитать R инферно http://www.burns-stat.com/pages/Tutor/R_inferno.pdf – rawr
Для меня при первом запуске с программированием в R, я думал, что петли - легкая часть. Это был просто логичный способ сделать то, что мне нужно, без огромного знания встроенных функций в R. С тех пор я взял опыт работы со всеми различными функциями и трюками, которые делают все быстрее. Функции более абстрактны, чем цикл for, поэтому для этого потребуется некоторое время. Это, как говорится, я все еще не сильный программист и полагаюсь на петли больше, чем я, вероятно, должен. Но пока вы держите это в себе, люди здесь не будут судить вас;) (только наполовину шутя) – rawr
также, я не совсем уверен, чего вы хотите от двух других кусков кода. – rawr