Функция R, которая берет фрейм данных и список столбцов, а затем для каждого из этих столбцов добавляет бинаризованные переменные в исходный фрейм данных. - PullRequest
0 голосов
/ 25 мая 2018

Эта функция не работает, но если я попробую код, не сделав его функцией, она будет работать.Я не могу понять, почему.Данные можно найти здесь: https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv

df.data<- read.csv("D:/My R project/data/gapminderDataFiveYear.csv")

namearray<- c(levels(unlist(df.data[, "continent"])))

binarycoladd<- function(a1, a2) {

 al1<- length(a2)
  al2<- nrow(a1)

  for (i in 1:al1) {

cname<- paste("binary", a2[i], sep = "_")

a1[cname]<- NA

    for (j in 1:al2) {
      a1[j,cname] = ifelse (a1[j,"continent"] == a2[i], 1, 0)
    }
  }
}

1 Ответ

0 голосов
/ 25 мая 2018

Вот правильная версия вашей функции:

df.data <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")

namearray <- as.character(levels(df.data$continent))

binarycoladd <- function(a1, a2) {
  for (cn in a2) {
    cname <- paste0("binary_", cn)
    a1[cname] <- (a1$continent == cn)
  }
  return(a1)
}

binarycoladd(df.data, namearray)

(Не забудьте сохранить результат ... <- binarycoladd(...))
Вот версия, как я бы это сделал:

binarycols <- function(x) {
  xlev <- levels(x)
  M <- sapply(xlev, '==', x)
  colnames(M) <- paste0("binary_", xlev)
  return(M)
}

cbind(df.data, binarycols(df.data$continent))

КСТАТИ:
, если вы хотите использовать $continent в регрессионной модели, логические фиктивные переменные внутренне генерируются функцией lm() - поэтому нет необходимости генерировать их явно:

df.data <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")
summary(lm(lifeExp ~ continent + year, data=df.data))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...