Имена переменных как входные данные в функции R - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть фрейм данных с несколькими числовыми переменными и коэффициентами.Я хочу запустить числовые переменные и заменить отрицательные значения на пропущенные.Я не мог этого сделать.

Моя альтернативная идея состояла в том, чтобы написать функцию, которая получает фрейм данных и переменную и делает это.Это тоже не сработало.

Мой код:

NegativeToMissing = function(df,var)
{
  df$var[df$var < 0] = NA
}

Error in $<-.data.frame(`*tmp*`, "var", value = logical(0)) : replacement has 0 rows, data has 40 

что я делаю не так?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

С tidyverse мы можем использовать mutate_if

library(tidyverse)
df1 %>%
    mutate_if(is.numeric, funs(replace(., . < 0, NA)))
0 голосов
/ 13 декабря 2018

Если вы все еще хотите изменить только одну выбранную переменную, решение с dplyr будет использовать нестандартная оценка :

library(dplyr)
NegativeToMissing <- function(df, var) {
  quo_var = quo_name(var)
  df %>% 
    mutate(!!quo_var := ifelse(!!var < 0, NA, !!var))

}

NegativeToMissing(data, var=quo(val1)) # use quo() function without ""
#   val1 val2
# 1    1    1
# 2   NA    2
# 3    2    3

Используемые данные:

data <- data.frame(val1 = c(1, -1, 2),
                   val2 = 1:3)
data
#   val1 val2
# 1    1    1
# 2   -1    2
# 3    2    3
0 голосов
/ 13 декабря 2018

Вот пример с некоторыми фиктивными данными.

df1 <- data.frame(col1 = c(-1, 1, 2, 0, -3),
                  col2 = 1:5,
                  col3 = LETTERS[1:5])
df1
#  col1 col2 col3
#1   -1    1    A
#2    1    2    B
#3    2    3    C
#4    0    4    D
#5   -3    5    E

Теперь найдите числовые столбцы

numeric_cols <- sapply(df1, is.numeric)

И замените отрицательные значения

df1[numeric_cols] <- lapply(df1[numeric_cols], function(x) replace(x, x < 0 , NA))
df1
#  col1 col2 col3
#1   NA    1    A
#2    1    2    B
#3    2    3    C
#4    0    4    D
#5   NA    5    E

Вы также можете сделать

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