Функция R для создания новой переменной из существующей переменной - PullRequest
1 голос
/ 25 мая 2020

У меня есть фрейм данных, в котором я хотел бы подавить определенные значения, если они основаны на ограниченном количестве наблюдений.

Мой набор данных выглядит примерно так:

> GROUP <- c("A", "B", "C", "D", "E", "F")
> AVERAGE <- c(100, 5, 10, 10, 5, 5)
> N_AVERAGE <- c(53, 5, 12, 20, 50, 2)
> df_average <- data.frame(GROUP , AVERAGE, N_AVERAGE)
> df_average
  GROUP AVERAGE N_AVERAGE
1     A     100        53
2     B       5         5
3     C      10        12
4     D      10        20
5     E       5        50
6     F       5         2

Я бы хотел бы создать новую переменную AVERAGE_new, которая принимает значение «AVERAGE», когда «N_AVERAGE» равно> = 10. Когда «N_AVERAGE» равно <10, я бы хотел, чтобы новая переменная была NA. </p>

Это была моя первая попытка:

funct_suppress <- function(dataset #input dataset
                           , var_goal # variable to suppress based on other variable
                           , var_N # variable used to determine whether to suppress
                           , lower_bound) # lower_bound for var_N, when value is below lower_bound, suppress var_goal
{
  dataset <- dataset %>% 
    mutate(paste0(var_goal,"_new") = ifelse((var_N < lower_bound),NA, var_goal))
}
df_average <- funct_suppress(df_average, AVERAGE, AVERAGE_nw,N_AVERAGE,10) # suppress all AVERAGE when N_AVERAGE  < 10

К сожалению, это не работает. Я понимаю, что R не сможет интерпретировать, что var_goal / var_N являются переменными. Поэтому я попробовал следующее:

> funct_suppress <- function(dataset #input dataset
+                            , var_goal # variable to suppress based on other variable
+                            , var_goal_nw # suppresses value of var_goal
+                            , var_N # variable used to determine whether to suppress
+                            , lower_bound) # lower_bound for var_N, when value is below lower_bound, suppress var_goal
+ {
+   
+   var_goal= enquo(var_goal) 
+   var_goal_nw= enquo(var_goal_nw) 
+   var_N = enquo(var_N)
+   
+   dataset <- dataset %>% 
+     mutate(var_goal = !!var_goal,
+            var_goal_nw = var_goal,
+            var_N = !!var_N,) %>% 
+     mutate(var_goal_nw = ifelse((var_N < lower_bound),NA, var_goal)) %>% 
+     select(-var_goal, -var_N)
+ }
> df_average <- funct_suppress(df_average, AVERAGE, AVERAGE_nw, N_AVERAGE,10) # suppress all AVERAGE when N_AVERAGE  < 10
> df_average
  GROUP AVERAGE N_AVERAGE var_goal_nw
1     A     100        53         100
2     B       5         5          NA
3     C      10        12          10
4     D      10        20          10
5     E       5        50           5
6     F       5         2          NA

Это работает, но моя новая переменная не имеет того имени, которое я хочу иметь.

Как мне это сделать? Если функция не является наиболее эффективным способом go об этом, я открыт для других предложений. Однако входные переменные должны иметь возможность изменяться, поскольку мне нужно выполнить эту задачу на нескольких фреймах данных с разными именами переменных.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

вы можете скопировать все значения, а затем удалить те, которые <10 после </p>

df_average$AVERAGE_new <- df_average$AVERAGE
df_average$AVERAGE_new[df_average$N_AVERAGE < 10] <- NA


 df_average
  GROUP AVERAGE N_AVERAGE AVERAGE_new
1     A     100        53         100
2     B       5         5          NA
3     C      10        12          10
4     D      10        20          10
5     E       5        50           5
6     F       5         2          NA
0 голосов
/ 28 мая 2020

Вы можете изменить свою функцию таким образом, если ваша версия dplyr как минимум 0.7:

funct_suppress <- function(dataset #input dataset
                         , var_goal # variable to suppress based on other variable
                         , var_goal_nw # suppresses value of var_goal
                         , var_N # variable used to determine whether to suppress
                         , lower_bound) # lower_bound for var_N, when value is below lower_bound, suppress var_goal
  {

         var_goal <-  enquo(var_goal) 
         var_goal_nw <-  enquo(var_goal_nw)
         var_N = enquo(var_N)
         varname <- quo_name(var_goal_nw)

           dataset %>% 
               mutate(!!varname := ifelse((!!var_N < lower_bound),NA, !!var_goal))
}

Важными частями являются varname <- quo_name(var_goal_nw) и !!varname :=. Другие отличия от вашей исходной функции - это всего лишь несколько незначительных изменений, чтобы быть более кратким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...