如何将多个列添加到tibble?

Oli*_* VR 0 r dplyr

我想在一个tibble中添加多个空列.新列的名称存储在'columnsToAdd'中

> columnsToAdd
[1] "column1" "column2" "column3" "column4" "column5"
Run Code Online (Sandbox Code Playgroud)

当我运行以下代码行时,...

library(dplyr)

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

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

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

Run Code Online (Sandbox Code Playgroud)

......我得到了这个结果,......

# 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    
Run Code Online (Sandbox Code Playgroud)

...相反,我希望得到以下结果:

# 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
Run Code Online (Sandbox Code Playgroud)

A. *_*man 7

我们可以将列名作为列表传递,然后使用!!!“triple bang”

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
Run Code Online (Sandbox Code Playgroud)

但是,我认为@MrGumble 可能会错过一些来自 add_column {tibble}

... 名称-值对,传递给 tibble()。对于数据框中的每一行,所有值都必须有一个元素,或者长度为 1。这些参数传递给 tibble(),因此也支持通过 !! 并通过 !!! 取消引用拼接。

这是一个例子 tibble {tibble}

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


Spa*_*man 6

只需将它们创建为列.这适用于基础数据帧和data.table表:

例如:

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

这给了我一栏:

> 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
Run Code Online (Sandbox Code Playgroud)

然后我做:

> someTibble[,columnsToAdd]=NA
Run Code Online (Sandbox Code Playgroud)

并且神奇地显示了列:

> 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     
Run Code Online (Sandbox Code Playgroud)

注意这不是真正的魔术,它是从R诞生之前的标准基本R行为.

  • +1人经常迷上dplyr,以至于他们常常忘记其他方法太简单了.这是一个很好的例子.在学习dplyr或其他包之前,学习基础R应该是必需的先决条件. (7认同)

MrG*_*ble 1

您所看到的tibble::add_column(columnsToAdd = NA)是 dplyr 和 tidyr 引入的准事物评估。如果你检查定义:

> args(add_column)
function (.data, ..., .before = NULL, .after = NULL) 
Run Code Online (Sandbox Code Playgroud)

你会发现它不需要特定的变量。它实际上需要实际的变量名称,不带引号。

一种完全不同的方法是创建一个矩阵(或 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))
Run Code Online (Sandbox Code Playgroud)