Как создать цикл с учетом комбинации столбцов в R - PullRequest
0 голосов
/ 22 октября 2018

Мой набор данных выглядит следующим образом: Data set Моя цель - создать множество атрибутов путем объединения текущих переменных.Например, я хочу создать атрибуты, которые называются HS_POC . Эти атрибуты показывают Да, когда в нашем наборе данных используется одно и то же приложение со статусом приложения H или S, а почтовый индекс точно такой же, в противном случае - НЕТ.Код для этого:

  sub <-subset(
    data,
    status  %in% c("H","S"),
    select = c(
     status,
      applications,
      postalcode))

attributes <-data.frame(setDT(sub)[, .(.N, applications) , by =
                          .(
                            status,
                            postalcode
                          )][N > 1])
attributes <- subset(attributes,
         select = c(applications, N))
attributes$N <- "Yes"
colnames(attributes)[colnames(attributes) == "N"] <- "HS_POC"
train <-
  merge(data, attributes, by = "applications", all.x =
          TRUE)
data$HS_POC <- data$HS_POC %>% replace_na("No")

, и в результате получается новый столбец, подобный этому
Result.

Я хотел бы создать много столбцов, таких как HS_POC с комбинацией других переменных, например HS_дата рождения , HS_product тип , HS_first name и ... Я создаю цикл для этого, ноэто очень медленно, как я могу улучшить это с точки зрения скорости.

    library(data.table)
data<-read.csv("test.csv")
Indep.var<-subset(data, select=-c(applications,Status))
aa<- colnames(Indep.var)
table<- t(combn(aa,2))
table<-data.frame(table)
table$Status<-c("Status")
table_status<- table
table_status<- as.matrix(table_status)
table$applications<-c("applications")
table_final<- as.matrix(table)
table_final[1,]
##paste(table_final[1,1],table_final[1,2],sep = "_")
##nrow(table_final)
N<-nrow(table_final)
for (i in 1:N)
{
  sub <- subset(data,
                Status  %in% c("H", "S"),
                select = table_final[i, ])

  attributes <- data.frame(setDT(sub)[, .(.N, applications) , by =
                                        eval(table_status[i,])][N > 1])
  attributes <- subset(attributes,
                       select = c(applications, N))

  if (nrow(attributes)== 0){
    colnames(attributes)[colnames(attributes) == "N"] <- paste("HS", table_final[i, 1], table_final[i, 2], sep = "_")
    data <- merge(data, attributes, by = "applications", all.x =
                    TRUE)

  }else{

  attributes$N <- "Yes"
  colnames(attributes)[colnames(attributes) == "N"] <- paste("HS", table_final[i, 1], table_final[i, 2], sep = "_")
  data <- merge(data, attributes, by = "applications", all.x =
            TRUE)
}
}


library(tidyr)
data %>% replace_na("No")
data[is.na(data)] <- "No"

Заранее спасибо за вашу помощь.

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