Как передать фрейм данных в функцию и вернуть выходные данные в фрейм данных - PullRequest
0 голосов
/ 16 января 2019

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

df
#   A     B      C
#   1   "USA"   1999
#   2     NA    1999
#   3   "GER"   1999
#   3   "GER"   1999

нет Я хочу заменить все значения в столбце B, которые равны в столбце A на 2, на «ABC». используя уровни здесь, потому что один столбец состоит из факторов (?)

levels(df$B) <- c(levels(df$B), "ABC") 
df$B[df$A==2]  <- "ABC"

так что это прекрасно работает. вывод - это именно то, что я хочу:

df
#   A     B      C
#   1   "USA"   1999
#   2   "ABC"   1999
#   3   "GER"   1999
#   3   "GER"   1999

но я хочу поместить это в функцию, потому что в моем проекте разные наборы данных с разными именами и именами столбцов, а также с разными числами для преобразования в другие строки, чем "ABC". Итак, как передать имена набора данных и столбцов? это моя попытка:

fun1 <- <- function(dataset,col1,col2) {
    levels(dataset$col1) <- c(levels(dataset$col1), "ABC")
    dataset$col1[dataset$col2==2]  <- "ABC"
    return(dataset)
}

Но я всегда получаю это сообщение об ошибке:

 Error in levels(dataset$col1) <- c(levels(dataset$col1), "ABC") : 
      attempt to set an attribute on NULL

1 Ответ

0 голосов
/ 16 января 2019

Мы можем использовать [[ вместо &, как с $, он ищет столбец с именем 'col1' или 'col2' вместо значения, связанного с аргументом

fun1 <-  function(dataset,col1,col2) {
  levels(dataset[[col1]]) <- c(levels(dataset[[col1]]), "ABC")
  dataset[[col1]][dataset[[col2]]==2]  <- "ABC"
  return(dataset)
  }

fun1(df, "B", "A")
#  A   B    C
#1 1 USA 1999
#2 2 ABC 1999
#3 3 GER 1999
#4 3 GER 1999

данные

df <- structure(list(A = c(1L, 2L, 3L, 3L), B = structure(c(2L, NA, 
 1L, 1L), .Label = c("GER", "USA"), class = "factor"), C = c(1999L, 
 1999L, 1999L, 1999L)), row.names = c(NA, -4L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...