如何将多个列添加到小标题?

时间:2019-02-14 15:18:51

标签: r dplyr

我想将多个空列添加到小标题。 新列的名称存储在'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 :(得分:5)

只需将它们创建为列即可。这适用于基本数据帧和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行为。

答案 1 :(得分:0)

您在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))

答案 2 :(得分:0)

我们可以将列名称作为列表传递,然后使用!!!“三重爆炸”

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(),因此也支持通过!!取消引用。并通过!!!取消引用拼接。

这是tibble {tibble}

的示例

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