【发布时间】:2018-12-23 05:53:36
【问题描述】:
我已经定义了一个函数,它将在数据框中动态创建新变量。对于此函数,输入是一个字符串,然后将其与其他字符串一起粘贴以创建数据框中已经存在的变量名称,然后在 mutate 中使用 case_when 进行比较。该函数的输出是数据帧,其末尾附加了新变量。我想将此函数应用于输入向量,并在数据框中创建多个新列。我已经使用 iris 数据集创建了一个与我正在做的非常相似的函数。
func <- function(x) {
a <- paste0("Sepal.", x)
b <- paste0("Petal.", x)
x <- iris %>%
mutate(
!!(paste0("Compare.", x)) :=
case_when(
iris[[a]] > iris[[b]] ~ "Sepal",
iris[[a]] < iris[[b]] ~ "Petal",
TRUE ~ "Equal"
)
)
return(x)
}
inputVector <- c("Length", "Width")
我想将此函数应用于 inputVector 并返回一个数据帧,其中包含两个新变量,最好没有循环。我正在寻找使用类似的东西
iris <- lapply(inputVector, func)
但这会返回一个包含两个数据框的列表。我也知道我可以在func 中使用<<-,但我想避免这种情况。
【问题讨论】:
-
小心,你运行的是
"SepalLength" > "PetalLength",而不是Sepal.Length > Petal.Length。除了点之外,您需要将字符串转换为引号并取消引用它们以引用变量而不是比较字符串本身。 -
已更新。感谢您指出这一点。我在实际工作中使用了 base r,但这个例子做得太快而错过了。