列引用 data.table 函数 R
Column reference data.table function R
我正在尝试创建一个函数来调用作为以下参数之一提供的数据 table 中的列:
df <- read.table(text = "x1 x2 y
CA 20 50
CA 30.5 100
CA 40.5 200
AZ 20.12 400
AZ 25 500
OR 86 600
OR 75 700
OR 45 800", header = TRUE)
df$x1 <- as.factor(df$x1)
library(data.table)
make_freq <- function(df, var_name){
df <- df
setDT(df)
tb <- df[, .N, by = var_name][,prop_ := round(((N/sum(N))*100), digits = 0)][order(var_name)]
gg1 <- ggplot(tb, aes(x = var_name, y = prop_)) +
geom_bar(width = .35, stat = "identity", color = "darkblue", fill = "darkblue") +
ggtitle(paste0("var_name")) +
theme_bw() +
theme(plot.title = element_text(size = 10)) +
theme(axis.text.x = element_text(angle = 45))
return(list(figure = gg1))
}
make_freq(df = df, var_name = x1)
理想情况下,我希望能够 运行 该函数,以便我可以使用 var_name
参数为我想要的任何分类变量创建 ggplot 图。我收到 Object x1 not found
错误,这让我觉得我需要在函数或其他内容中引用或取消引用 var_name
参数。
- 你应该引用
x1
因为你没有这个对象(这是列的名称)。
data.table
对象中的参数 by
可能是字符,df[, .N, by = var_name]
是好的代码。但是 [order(var_name)]
是错误的。您可以使用 [order(get(var_name))]
.
- 因为
var_name
是我们需要在 ggplot 中将 var_name
更改为 get(var_name)
的字符。
完整代码:
make_freq <- function(df, var_name){
df <- df
setDT(df)
tb <- df[, .N, by = var_name][,prop_ := round(((N/sum(N))*100), digits = 0)][order(get(var_name))]
gg1 <- ggplot(tb, aes(x = get(var_name), y = prop_)) +
geom_bar(width = .35, stat = "identity", color = "darkblue", fill = "darkblue") +
ggtitle(paste0("var_name")) +
theme_bw() +
theme(plot.title = element_text(size = 10)) +
theme(axis.text.x = element_text(angle = 45))
return(list(figure = gg1))
}
make_freq(df = df, var_name = "x1")
是的,如果您想使用 non-standard 评估,您需要引用 var_name
参数。只需添加:
var_name <- substitute(var_name)
到函数的顶部。请注意,在这种情况下,默认的 x 轴标签将为 var_name
。如果您希望它默认为作为 var_name
传递的任何内容,您将需要执行几个额外的步骤。将函数的顶部更改为:
x <- enquo(var_name)
var_name <- substitute(var_name)
然后修改tb
行。
tb <- df[, .N, by = eval(deparse(var_name))][,prop_ := round(((N/sum(N))*100), digits = 0)][order(eval(var_name))]
然后在ggplot()
:
gg1 <- ggplot(tb, aes(x = !!x, y = prop_)) + ...
我正在尝试创建一个函数来调用作为以下参数之一提供的数据 table 中的列:
df <- read.table(text = "x1 x2 y
CA 20 50
CA 30.5 100
CA 40.5 200
AZ 20.12 400
AZ 25 500
OR 86 600
OR 75 700
OR 45 800", header = TRUE)
df$x1 <- as.factor(df$x1)
library(data.table)
make_freq <- function(df, var_name){
df <- df
setDT(df)
tb <- df[, .N, by = var_name][,prop_ := round(((N/sum(N))*100), digits = 0)][order(var_name)]
gg1 <- ggplot(tb, aes(x = var_name, y = prop_)) +
geom_bar(width = .35, stat = "identity", color = "darkblue", fill = "darkblue") +
ggtitle(paste0("var_name")) +
theme_bw() +
theme(plot.title = element_text(size = 10)) +
theme(axis.text.x = element_text(angle = 45))
return(list(figure = gg1))
}
make_freq(df = df, var_name = x1)
理想情况下,我希望能够 运行 该函数,以便我可以使用 var_name
参数为我想要的任何分类变量创建 ggplot 图。我收到 Object x1 not found
错误,这让我觉得我需要在函数或其他内容中引用或取消引用 var_name
参数。
- 你应该引用
x1
因为你没有这个对象(这是列的名称)。 data.table
对象中的参数by
可能是字符,df[, .N, by = var_name]
是好的代码。但是[order(var_name)]
是错误的。您可以使用[order(get(var_name))]
.- 因为
var_name
是我们需要在 ggplot 中将var_name
更改为get(var_name)
的字符。
完整代码:
make_freq <- function(df, var_name){
df <- df
setDT(df)
tb <- df[, .N, by = var_name][,prop_ := round(((N/sum(N))*100), digits = 0)][order(get(var_name))]
gg1 <- ggplot(tb, aes(x = get(var_name), y = prop_)) +
geom_bar(width = .35, stat = "identity", color = "darkblue", fill = "darkblue") +
ggtitle(paste0("var_name")) +
theme_bw() +
theme(plot.title = element_text(size = 10)) +
theme(axis.text.x = element_text(angle = 45))
return(list(figure = gg1))
}
make_freq(df = df, var_name = "x1")
是的,如果您想使用 non-standard 评估,您需要引用 var_name
参数。只需添加:
var_name <- substitute(var_name)
到函数的顶部。请注意,在这种情况下,默认的 x 轴标签将为 var_name
。如果您希望它默认为作为 var_name
传递的任何内容,您将需要执行几个额外的步骤。将函数的顶部更改为:
x <- enquo(var_name)
var_name <- substitute(var_name)
然后修改tb
行。
tb <- df[, .N, by = eval(deparse(var_name))][,prop_ := round(((N/sum(N))*100), digits = 0)][order(eval(var_name))]
然后在ggplot()
:
gg1 <- ggplot(tb, aes(x = !!x, y = prop_)) + ...