删除重复的行子集

时间:2013-11-24 22:47:14

标签: r duplicate-removal

我有按日期排序的索引中的股票列表,我正在尝试删除前一行具有相同股票代码的所有行。这将给出初始索引的数据框以及索引发生变化的所有日期

在我的工作示例中,我将使用名称而不是日期列和一些数字。

起初,我以为我可以使用subset()和!duplicatelicated

删除行
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]))

但是,如果从列表中删除库存然后更换库存,这可能不起作用。因此,在我的工作示例中,所需的输出是Joe,Mary,Frank,Carol和Jay的行。

接下来,我创建了一个函数来判断索引是否发生了变化。该函数的输入是行号:

#------ 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的帮助,对循环的任何其他一般建议表示赞赏!

1 个答案:

答案 0 :(得分: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