Извлечение значения из фрейма данных итеративно (R)

#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