Добавьте столбец, созданный в функции, во фрейм данных в R

#r

Вопрос:

Я искал и пробовал несколько ранее заданных вопросов, которые могли бы быть похожи на мой вопрос, но ни один из них не сработал.

У меня есть фрейм данных в R под названием df2, столбец под названием df2$col. Я создал функцию, которая принимает df, df$col и два параметра, которые являются именами для двух новых столбцов, которые я хочу создать и обработать в функции. После завершения работы функции я хочу получить возвращаемый df с включенными двумя новыми столбцами. Я действительно возвращаю два столбца, но они названы в честь заполнителей в оболочке функции. Смотреть ниже:

 df2 = data.frame(col = c(1, 3, 4, 5), 
                col1 = c(9, 6, 8, 3),
                col2 = c(8, 2, 8, 4))
 

созданная мной функция возьмет col и что-то с ним сделает; вернет преобразованный col, а также два вновь созданных столбца:

 no_way <- function(df, df_col_name, df_col_flagH, df_col_flagL) {

  lo_perc <- 2
  hi_perc <- 6

  df$df_col_flagH <- as.factor(ifelse(df_col_name<lo_perc, 1, 0))
  df$df_col_flagL <- as.factor(ifelse(df_col_name>hi_perc, 1, 0))

  df_col_name <- df_col_name   1.4
  df_col_name <- df_col_name * .12
  
  return(df)

}
 

Когда я вызываю функцию no_way(df2, col, df$new_col, df$new_col2), вместо того, чтобы получить df с col, col1, col2, new_col1, new_col2, я правильно получаю первые три, но получаю параметрические имена для последних двух. Итак, что-то вроде df, col, col1, col2, df_col_flagH, df_col_flagL. По сути, я хочу, чтобы функция возвращала df с именами новых столбцов, которые я даю ей при вызове. Пожалуйста, помогите.

Комментарии:

1. Используйте [[ вместо $ . Вы (и каждый пользователь R) должны учиться help("$") не реже одного раза в год и чаще, если вы новичок.

2. @Roland Я действительно пробовал это раньше, но получил сообщение об ошибке: «попытка выбрать менее одного элемента в OneIndex «. Я просто попробовал еще раз и получил то же самое сообщение.

3. Вам также необходимо изменить способ вызова своей функции. Я (или кто-то другой) показал бы вам в ответе, но я не понимаю, чего должны достичь эти две df_col_name <- ... строки.

Ответ №1:

Я не понимаю, что пытается сделать ваша функция, но это может указать вам правильное направление:

 no_way <- function(df = df2, df_col_name = "col", df_col_flagH = "col1", df_col_flagL = "col2") {
  
  lo_perc <- 2
  hi_perc <- 6
  
  df[[df_col_flagH]] <- as.factor(ifelse(df[[df_col_name]] < lo_perc, 1, 0)) # as.factor? 
  df[[df_col_flagL]] <- as.factor(ifelse(df[[df_col_name]] > hi_perc, 1, 0))
        
  df[[df_col_name]] <- (df[[df_col_name]]   1.4) * 0.12 # Do in one step      
  
  return(df)     
}
 

Ответ №2:

Вместо этого мне нужно было вызвать функцию с новыми именами столбцов в виде строк:

 no_way(mball, 'TEAM_BATTING_H', 'hi_TBH', 'lo_TBH')
 

Кроме того, мне пришлось использовать скобки вокруг целевого столбца в моей функции.