Как я могу указать имя в паре имя-значение внутри цикла for?
У меня есть этот пример сценария:
library(tidyverse)
placeholder <- c("foo", "bar", "baz", "bash")
x <- 1
for (name in placeholder) {
iris <- iris %>% add_column(name = rep("example", nrow(iris)),
.after = x)
x <- x + 2
}
То, что я хотел бы сделать, это вставить столбец после каждой характеристики цветка, с именами столбцов из элементов в placeholder
,
Ожидаемый результат:
Sepal.Length foo Sepal.Width bar Petal.Length baz Petal.Width bash Species
1 5.1 example 3.5 example 1.4 example 0.2 example setosa
2 4.9 example 3.0 example 1.4 example 0.2 example setosa
3 4.7 example 3.2 example 1.3 example 0.2 example setosa
4 4.6 example 3.1 example 1.5 example 0.2 example setosa
5 5.0 example 3.6 example 1.4 example 0.2 example setosa
6 5.4 example 3.9 example 1.7 example 0.4 example setosa
Однако мой цикл for помечает первый столбец цикла for name
, а затем завершается с ошибкой, говоря Error: Column name already exists
,
Что я получаю:
Sepal.Length name Sepal.Width Petal.Length Petal.Width Species
1 5.1 example 3.5 1.4 0.2 setosa
2 4.9 example 3.0 1.4 0.2 setosa
3 4.7 example 3.2 1.3 0.2 setosa
4 4.6 example 3.1 1.5 0.2 setosa
5 5.0 example 3.6 1.4 0.2 setosa
6 5.4 example 3.9 1.7 0.4 setosa
1 ответ
Решение
Мы можем использовать оператор присваивания (:=
) с name
оценивается (!!
) на lhs для установки значений заполнителей в качестве имен столбцов
x <- 1
for (name in placeholder) {
iris <- iris %>% add_column(!! name := rep("example", nrow(iris)),
.after = x)
x <- x + 2
}
head(iris)
# Sepal.Length foo Sepal.Width bar Petal.Length baz Petal.Width bash Species
#1 5.1 example 3.5 example 1.4 example 0.2 example setosa
#2 4.9 example 3.0 example 1.4 example 0.2 example setosa
#3 4.7 example 3.2 example 1.3 example 0.2 example setosa
#4 4.6 example 3.1 example 1.5 example 0.2 example setosa
#5 5.0 example 3.6 example 1.4 example 0.2 example setosa
#6 5.4 example 3.9 example 1.7 example 0.4 example setosa