R с / без dplyr: создавать новые столбцы как комбинации пред.столбцы в строке - PullRequest
0 голосов
/ 26 июня 2018

Предположим, у меня есть такой фрейм данных:

A B C
1 0 1
0 1 1
1 0 0

Я бы хотел создать следующую производную с использованием dplyr (или другой библиотеки lib):

A B C AB AC BC
1 0 1 0  1  0
0 1 1 0  0  1
1 0 0 0  0  0

Итак, я быхотите автоматически создавать новые столбцы во фрейме данных, где их значениями будут продукты начального набора столбцов (поэтому в данном случае 3 продукта для каждой строки - A * B, A * C и B * C).Суть в том, чтобы сделать это автоматически (у меня есть 6 столбцов, я не могу кодировать все комбинации).Имена автоматически создаваемых столбцов должны иметь некоторую схему именования, так как позже мне потребуется их отфильтровать.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Мы можем использовать combn, чтобы получить комбинацию столбцов, а затем использовать цикл for для создания новых столбцов.

# Create example data frame
dat <- read.table(text = "A B C
1 0 1
                  0 1 1
                  1 0 0",
                  header = TRUE)

# Create the column name combination
m <- combn(names(dat), m = 2)

# Create new columns
for (i in 1:ncol(m)){
  dat[paste(m[, i], collapse = "")] <- dat[m[1, i]] * dat[m[2, i]]
}

dat
#   A B C AB AC BC
# 1 1 0 1  0  1  0
# 2 0 1 1  0  0  1
# 3 1 0 0  0  0  0
0 голосов
/ 26 июня 2018

Иногда лучше кодировать, не задумываясь:

df <- data.frame(A = c(1, 0, 1), 
                 B = c(0, 1, 0),
                 C = c(1, 1, 0))
J <- K <- seq_along(df)
J_n <- K_n <- names(df)

for (j in J) {
  for (k in K) {
    if (j < k) {
      j_name <- J_n[j]
      k_name <- K_n[k]
      df[[paste0(j_name, k_name)]] <- df[[j]] * df[[k]]
    }
  }
}

Предполагается, что новые имена отсутствуют в исходном фрейме данных.Поэтому, если ваш исходный фрейм данных содержал столбцы A, B и AB, это не сработает.

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