У меня есть фрейм данных, в котором я хотел бы подавить определенные значения, если они основаны на ограниченном количестве наблюдений.
Мой набор данных выглядит примерно так:
> 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 об этом, я открыт для других предложений. Однако входные переменные должны иметь возможность изменяться, поскольку мне нужно выполнить эту задачу на нескольких фреймах данных с разными именами переменных.
Спасибо!