#r #function #select #criteria
#r #функция #выберите #критерии
Вопрос:
У меня есть функция для выбора значения из фрейма данных. Я хочу выбрать это значение, сохранить его, удалить из набора данных и выбрать значение, используя ту же функцию, из оставшихся значений в фрейме данных. Каков наилучший способ сделать это?
Вот простой пример:
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')
Как я могу настроить это так, чтобы повторно применить функцию maximum к оставшимся значениям в df и сохранить эти значения в версии V2?
Я использую другой и более сложный набор функций и операторов if / else, чем max — это всего лишь пример. Мне нужно повторно применить функцию к оставшимся значениям, потому что я буду использовать функцию в новом фрейме данных, если df пуст.
Комментарии:
1. Я не использую функцию max в реальной функции — фактическая слишком сложна, чтобы использовать ее здесь. Что мне в основном нужно сделать, так это знать, как использовать функцию для извлечения значения из фрейма данных, а затем повторно применить ту же функцию к обновленному фрейму данных без этого значения.
Ответ №1:
Это то, что вы ищете?
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,df2,depth,count 1)
}
}
recursive_function(df1,df2)
Ответ №2:
Вот еще одно решение, на которое я наткнулся:
V1 <- c(5,6,7,8,9,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