Автоматическое удаление биективных столбцов из фрейма данных, идентифицированного с помощью команды whichAreBijection, из пакета dataPreperation с использованием r - PullRequest
0 голосов
/ 09 апреля 2020

У меня проблемы с выполнением простой задачи:

Скажем, я использую эти библиотеки и у меня есть этот фрейм данных:

library(tidyverse)
library(dataPreparation)

df <- data.frame(col1 = 1, col2 = rnorm(1e1), col3 = sample(c(1, 2), 1e1, replace = TRUE))
df$col4 <- df$col2
df$col5[df$col3 == 1] = "a"
df$col5[df$col3 == 2] = "b"
df$col6 = c("b","b","a","a","b","a","a","a","a","b")
df$col7 = "d"
df$col8 = c(3,3,5,5,3,5,5,5,5,3)
df$col9 = c("x","x","y","y","x","y","y","y","y","x")
df$col10 = c("p","p","q","p","q","q","p","p","q","q")
df$col11 = c(10.5,10.5,11.37,10.5,11.37,11.37,10.5,10.5,11.37,11.37)
df <- df %>% mutate_if(is.character,as.factor)

Используя приведенную ниже команду, я хочу удалить столбцы 4 , 5, 7, 8, 9, 11 от df.

whichAreBijection(df)
[1] "whichAreBijection: col7 is a bijection of col1. I put it in drop list."
[1] "whichAreBijection: col4 is a bijection of col2. I put it in drop list."
[1] "whichAreBijection: col5 is a bijection of col3. I put it in drop list."
[1] "whichAreBijection: col8 is a bijection of col6. I put it in drop list."
[1] "whichAreBijection: col9 is a bijection of col6. I put it in drop list."
[1] "whichAreBijection: col11 is a bijection of col10. I put it in drop list."
[1] "whichAreBijection: it took me 0.08s to identify 6 column(s) to drop."
[1]  4  5  7  8  9 11

Я могу удалить их вручную, используя

df$col4 = NULL
df$col5 = NULL
df$col7 = NULL
df$col8 = NULL
df$col9 = NULL
df$col11 = NULL

Я хочу, однако, алгоритм, чтобы сделать это автоматически.

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

x <- whichAreBijection(df)
y <- length(x)

m <- as.data.frame(matrix(0, ncol = y, nrow = nrow(df)))
i = 1
while (i< y+1) {
  # z <- names(df)[x[i]]
  m[,i] <- df[,x[i]]
  i<- i+1
}

Выше генерируется m с постоянными значениями, заданными как 4, 5, 7, 8, 9, 11

Я вижу, что использование простой команды, такой как

m[,1] <- df[,4]

, прекрасно заменяет первый столбец m на 4-й столбец df.

Вторая проблема, которую я имею, - это использование тех же имен столбцов в m, что и в df. Может быть, это звучит далеко, чтобы сделать простую задачу.

  1. Почему столбцы не заменяются точно в м?

  2. Как я могу автоматически позволить m выбрать имена столбцов df, которые будут удалены как имена столбцов?

  3. Есть ли лучший способ избежать этого беспорядка и сделать прямое удаление имен столбцов, предложенных whichAreBijection?

1 Ответ

0 голосов
/ 10 апреля 2020

Мне удалось решить вопрос 1 с помощью следующего:

x <- whichAreBijection(df)
y <- length(x)
m <- as.data.frame(matrix(0, ncol = y, nrow = nrow(df)))
i = 1
while (i< y+1) {
    m[,i] <- df[,x[i], with = FALSE]
    i<- i+1
}

Кажется, значение индекса именованного столбца не работает, тогда как индекс целочисленного столбца работает с правой стороны, я имею в виду x [ я]. Этого можно избежать, установив в конце значение = FALSE.

Следующий вопрос - следующий вопрос.

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