我有按日期排序的索引中的股票列表,我正在尝试删除前一行具有相同股票代码的所有行。这将给出初始索引的数据框以及索引发生变化的所有日期
在我的工作示例中,我将使用名称而不是日期列和一些数字。
起初,我以为我可以使用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的帮助,对循环的任何其他一般建议表示赞赏!
答案 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