问题描述
我有一个函数可以从数据框中选择一个值。我想选择该值,保存它,将其从数据集中删除,然后使用相同的函数从数据框中的其余值中选择一个值。这样做的最佳方法是什么?
这是一个简单的例子:
V1 <- c(5,6,7,8,9,10)
df <- data.frame(V1)
V2 <- as.data.frame(matrix(nrow=3,ncol=1))
maximum <- function(x){
max(x)
}
V2[i,]<- maximum(df)
df <- anti_join(df,V2,by='V1')
如何进行设置,以便将最大值函数重新应用于 df 中的剩余值并将这些值保存在 V2 中?
(此外,我使用的是一组不同且更复杂的函数和 if/else 语句,而不是 max - 这只是一个示例。我必须将该函数重新应用于剩余的值,因为我将使用如果 df 为空,则在新数据帧上运行)。
解决方法
这是您要找的吗?
V1 <- data.frame(origin = c(5,6,7,8,9,10))
V2 <- as.data.frame(matrix(nrow=3,ncol=1))
df1 <- V1
df2 <- V2
recursive_function <- function(df1,df2,depth = 3,count = 1){
if (count == depth){
# Find index
indx <- which.max(df1[,1])
curVal <- df1[indx,1]
df2[count,1] <- curVal
df1 <- df1[-indx,drop = FALSE]
return(list(df1,df2))
} else {
# Find index
indx <- which.max(df1[,1])
# Find Value
curVal <- df1[indx,1]
# Add value to new data frame
df2[count,1] <- curVal
# Subtract value from old dataframe
df1 <- df1[-indx,drop = FALSE]
recursive_function(df1,depth,count + 1)
}
}
recursive_function(df1,df2)
,
这是我偶然发现的另一个解决方案:
V1 <- c(5,10)
df <- data.frame(V1)
minFun <- function(df,maxRun){
V2 <- as.data.frame(matrix(nrow=maxRun,ncol=1))
for(i in 1:maxRun){
V2[i,]<- min(df)
df <- dplyr::anti_join(df,V2,by='V1')
}
return(V2)
}
test <- minFun(df = df,maxRun = 3)
test