假設我有這些資料:
data <- data. frame(a = c(1, 2,3))
還有一個簡單的函式,可以創建一個資料框。它還根據一個簡單的函式創建了一個新的變數;這個新的變數取的是用varname傳入的名字。以下是我的嘗試(assign行是錯誤的):
fun < - function(varname) {
data <- data. frame(a = c(1。 2,3))
assign(paste0("data$"。 varname)。 sqrt(data$a))
資料
}
fun("newvar"/span>)
Base R或tidyverse的解決方案都很棒。
uj5u.com熱心網友回復:
你很接近! 有多種方法對資料幀進行子集,包括使用[[.]]符號(例如,data[["var"]]。簡單地給一個新的列賦值就可以初始化這個列。
fun < - function(varname) {
data <- data. frame(a = c(1。 2,3))
data[[varname] < - sqrt(data$a)
資料
}
fun("newvar")
uj5u.com熱心網友回復:
tidyverse
如果你想把變數名作為一個字串傳遞,那么一個tidyverse方法將是:
library(dplyr)
fun <- function(varname) {>
資料。 frame(a = c(1。 2,3)) %> %
mutate(!! varname := sqrt(a))
}
fun("newvar"/span>)
另外,你可以使用tidyeval,這樣你就不必參考變數名了:
library(dplyr)
fun <- function(varname) {
varname <- rlang::enquo(varname)
資料。 frame(a = c(1。 2,3)) %> %
mutate(!! varname := sqrt(a))
}
fun(newvar)
base R
如果你想使用base R,我會推薦@Noah發布的解決方案,但另一個相當隱晦的base R選項是:
fun < - function(varname) {
資料。 frame(a = c(1。 2,3)) |>
在(eval(substitute(x < - sqrt(a)/span>。 list(x = as. name(varname)。 標點符號">))))
}。
fun("newvar"/span>)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/332211.html
標籤:
