Как добавить несколько столбцов в таблицу? - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу добавить несколько пустых столбцов в таблицу.Имена новых столбцов хранятся в 'columnsToAdd'

> columnsToAdd
[1] "column1" "column2" "column3" "column4" "column5"

Когда я запускаю следующие строки кода, ...

library(dplyr)

someTibble <- tibble(name = paste("Name", 1:10))

columnsToAdd <- paste("column", 1:30, sep = "")

someTibble %>% 
tibble::add_column(columnsToAdd = NA)

... я получаю этот результат, ...

# A tibble: 10 x 2
   name    columnsToAdd
   <chr>   <lgl>       
 1 Name 1  NA          
 2 Name 2  NA          
 3 Name 3  NA          
 4 Name 4  NA          
 5 Name 5  NA          
 6 Name 6  NA          
 7 Name 7  NA          
 8 Name 8  NA          
 9 Name 9  NA          
10 Name 10 NA    

... вместо этого я хочу получить следующий результат:

# A tibble: 10 x 6
   name    column1 column2 column3 column4 column5
   <chr>     <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
 1 Name 1       NA      NA      NA      NA      NA
 2 Name 2       NA      NA      NA      NA      NA
 3 Name 3       NA      NA      NA      NA      NA
 4 Name 4       NA      NA      NA      NA      NA
 5 Name 5       NA      NA      NA      NA      NA
 6 Name 6       NA      NA      NA      NA      NA
 7 Name 7       NA      NA      NA      NA      NA
 8 Name 8       NA      NA      NA      NA      NA
 9 Name 9       NA      NA      NA      NA      NA
10 Name 10      NA      NA      NA      NA      NA

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Просто создайте их как столбцы.Это работает для базовых фреймов данных и таблиц data.table:

Например:

> someTibble <- tibble(name = paste("Name", 1:10))
> columnsToAdd <- paste("column", 1:3,sep="")

Это дает мне один столбец:

> head(someTibble)
# A tibble: 6 x 1
  name  
  <chr> 
1 Name 1
2 Name 2
3 Name 3
4 Name 4
5 Name 5
6 Name 6

Тогда я делаю:

> someTibble[,columnsToAdd]=NA

и волшебным образом появляются столбцы:

> head(someTibble)
# A tibble: 6 x 4
  name   column1 column2 column3
  <chr>  <lgl>   <lgl>   <lgl>  
1 Name 1 NA      NA      NA     
2 Name 2 NA      NA      NA     
3 Name 3 NA      NA      NA     
4 Name 4 NA      NA      NA     
5 Name 5 NA      NA      NA     
6 Name 6 NA      NA      NA     

Обратите внимание, что это на самом деле не волшебство, это стандартное базовое поведение R с тех пор, как родился до R.

0 голосов
/ 14 февраля 2019

Мы можем передать имена столбцов в виде списка, а затем использовать !!! «тройной взрыв»

columnsToAdd <- paste("column", 1:5, sep = "")

someTibble %>% 
     tibble::add_column(!!!set_names(as.list(rep(NA, length(columnsToAdd))),nm=columnsToAdd))

# A tibble: 6 x 6
name   column1 column2 column3 column4 column5
<chr>  <lgl>   <lgl>   <lgl>   <lgl>   <lgl>  
1 Name 1 NA      NA      NA      NA      NA     
2 Name 2 NA      NA      NA      NA      NA     
3 Name 3 NA      NA      NA      NA      NA     
4 Name 4 NA      NA      NA      NA      NA     
5 Name 5 NA      NA      NA      NA      NA     
6 Name 6 NA      NA      NA      NA      NA

Однако я думаю, что @MrGumble может пропустить что-то, начиная с add_column {tibble}

... Пары имя-значение, передаваемые в tibble ().Все значения должны иметь один элемент для каждой строки во фрейме данных или иметь длину 1. Эти аргументы передаются в tibble (), и поэтому также поддерживают unquote через !!и unquote-splice via !!!.

, и вот пример из tibble {tibble}

tibble(!!! list(x = rlang::quo(1:10), y = quote(x * 2)))

0 голосов
/ 14 февраля 2019

То, что вы видите в tibble::add_column(columnsToAdd = NA), - это квази-нечто, представленное dplyr и tidyr.Если вы проверите определение:

> args(add_column)
function (.data, ..., .before = NULL, .after = NULL) 

, вы увидите, что оно не ожидает определенной переменной.Он буквально ожидает фактическое имя переменной без кавычек.

Совершенно другой подход заключается в создании матрицы (или data.frame, независимо от того, что вам нравится), и отбрасывании его на сторону someTibble:

extra <- matrix(NA_real_, nrow=nrow(someTibble), ncol=length(columnsToAdd), dimnames=list(NULL, columnsToAdd))
dplyr::bind_cols(someTibble, as.data.frame(extra))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...