Маскирование переменных в кадре данных на основе его типа столбца в R - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь замаскировать переменные, запрошенные пользователем (what) в data.frame на BASE R. Я написал функцию foo для достижения этой цели для запрошенных числовых c переменных в data.frame. .

Но мне интересно, как маскировать символьные переменные (например, pid в приведенном ниже примере)?

Для конкретности ниже приведены мои data.frame, моя функция foo и желаемые выходы .

dat <- data.frame(sid = c(33,33,41,42,49,51), pid = c('Bob', 'Bob', 'Jim', 'John', 'Carol smith', 'Cathy'))

#== function `foo`:
foo <- function(data, what){

  f <- function(data, what){

  data[[what]] <- as.numeric(factor(data[[what]], levels = unique(data[[what]])))
  return(data[what])
 }
data[what] <- lapply(what, f, data = data)
return(data)
}
#== Example of use:
 foo(dat, c('sid', 'pid'))

desired.output1 <- data.frame(sid = c(1,1,2, 3,4,5), pid = c('B', 'B', 'Ji', 'Jo', 'Car', 'Cat'))

desired.output2 <- data.frame(sid = c(1,1,2, 3,4,5), pid = c('B', 'B', 'J.1', 'J.2', 'C.1', 'C.2'))

1 Ответ

1 голос
/ 27 апреля 2020

Мы можем применять различные функции для числительных c и символьных столбцов.

foo <- function(data, what){
  dat <- data[what]
  f1 <- function(x) as.numeric(factor(x, levels = unique(x)))
  f2 <- function(x) {
        temp <- substr(x, 1, 1)
        paste0(temp, ave(x, temp, FUN = function(y) match(y, unique(y))))
  }
  num_cols <- names(dat)[sapply(dat, is.numeric)]
  char_cols <- names(dat)[sapply(dat, is.character)]
  if(length(num_cols))  data[num_cols] <- lapply(data[num_cols], f1)
  if(length(char_cols)) data[char_cols] <- lapply(data[char_cols], f2)
  return(data)
}

foo(dat, c('sid', 'pid'))
#  sid pid
#1   1  B1
#2   1  B1
#3   2  J1
#4   3  J2
#5   4  C1
#6   5  C2

foo(dat, 'pid')

#  sid pid
#1  33  B1
#2  33  B1
#3  41  J1
#4  42  J2
#5  49  C1
#6  51  C2


foo(dat, 'sid')
#  sid         pid
#1   1         Bob
#2   1         Bob
#3   2         Jim
#4   3        John
#5   4 Carol smith
#6   5       Cathy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...