我想在一个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)
我们可以将列名作为列表传递,然后使用!!!“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)))
只需将它们创建为列.这适用于基础数据帧和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行为.
您所看到的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)
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |