Добавьте количество столбцов X в data.frame - PullRequest
0 голосов
/ 23 февраля 2020

Я хотел бы добавить переменное число (X) столбцов с 0 к существующему data.frame внутри функции.

Вот пример data.frame:

dt <- data.frame(x=1:3, y=4:6)

Я хотел бы получить этот результат, если X = 1:

  a x y
1 0 1 4
2 0 2 5
3 0 3 6

И это, если X = 3:

  a b c x y
1 0 0 0 1 4
2 0 0 0 2 5
3 0 0 0 3 6

Какой эффективный способ сделать это?

Ответы [ 3 ]

3 голосов
/ 23 февраля 2020

Мы можем присвоить нескольким столбцам значение '0' на основе значения 'X'

X <- 3
nm1 <- names(dt)
dt[letters[seq_len(X)]] <- 0
dt[c(setdiff(names(dt), nm1), nm1)]

Кроме того, мы можем использовать add_column из tibble и создавать столбцы по заданным параметрам. c местоположение

library(tibble)
add_column(dt, .before = 1,  !!!setNames(as.list(rep(0, X)), 
        letters[seq_len(X)]))
2 голосов
/ 23 февраля 2020

Второй параметр - cbind

f <- function(x, n = 3) {
  cbind.data.frame(matrix(
    0,
    ncol = n,
    nrow = nrow(x),
    dimnames = list(NULL, letters[1:n])
  ), x)
}

f(dt, 5)
#  a b c d e x y
#1 0 0 0 0 0 1 4
#2 0 0 0 0 0 2 5
#3 0 0 0 0 0 3 6

ПРИМЕЧАНИЕ: поскольку длина letters равна 26, функция потребует некоторой корректировки в отношении схемы именования, если n > 26.

1 голос
/ 23 февраля 2020
  • Вы можете попробовать приведенный ниже код
dt <- cbind(`colnames<-`(t(rep(0,X)),letters[seq(X)]),dt)
  • Если вам не нужны имена столбцов добавленных столбцов, вы можете использовать только
dt <- cbind(t(rep(0,X)),dt)

что намного короче

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