我正在尝试编写一个自定义函数,它将根据预定义变量向量(例如vector_heavy)的值计算新变量,然后根据提供给函数的参数(例如,custom_name)命名新变量.
这个变量命名是我的技能失败的地方.任何帮助是极大的赞赏.
library(tidyverse)
vector_heavy <- quos(disp, wt, cyl)
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(!!cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
}
d <- cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy)
Run Code Online (Sandbox Code Playgroud)
我的错误消息是:
Error: unexpected '=' in:
" rowwise() %>%
mutate(!!cv_name ="
Run Code Online (Sandbox Code Playgroud)
删除!!之前cv_name的mutate()将导致一个函数计算一个字面命名的新变量cv_name,并忽略custom_name我作为参数包含的内容.
cv_compute <- function(data, cv_name, cv_vector){
cv_name <- enquo(cv_name)
data %>%
rowwise() %>%
mutate(cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>%
ungroup()
} …Run Code Online (Sandbox Code Playgroud) 当我使用 complete() 函数填充数据中没有案例的行时,我发现它也创建了许多重复的行。这些可以使用 unique() 函数删除,但我想了解如何避免首先生成所有这些额外的行。
library(dplyr)
library(tidyr)
# An incomplete table
mtcars %>%
group_by(vs, cyl) %>%
count()
# complete() creates a table with many duplicate rows
temp <-
mtcars %>%
group_by(vs, cyl) %>%
count() %>%
complete(vs = c(0, 1), cyl = c(4, 6, 8), fill = list(n = 0))
unique(temp)
Run Code Online (Sandbox Code Playgroud) 这是几天前开始发生的,它scales::percent会在其标签中添加一个小数位,而且我似乎无法禁用该小数位以在y轴上显示整数值。
library(dplyr)
library(ggplot2)
mtcars %>%
count(cyl) %>%
mutate(prop = n / sum(n)) %>%
ggplot(aes(x = cyl, y = prop)) +
geom_point() +
scale_y_continuous(labels = scales::percent)
Run Code Online (Sandbox Code Playgroud) 是否可以在ggplot中明确设置面板大小(即灰色网格面板)?我想(但是找不到)有一些ggplot扩展允许类似的参数panel.width = unit(3, "in"), panel.height = unit(4, "in").
我已经看到了设置整个绘图大小的解决方案,或者使用egg包来获得多个绘图对齐的解决方案.但没有什么可以让我明确设置面板的大小.
library(dplyr)
library(ggplot2)
library(tibble)
ds_mt <- mtcars %>% rownames_to_column("model")
mt_short <- ds_mt %>% arrange(nchar(model)) %>% slice(1:4)
mt_long <- ds_mt %>% arrange(-nchar(model)) %>% slice(1:4)
p_short <-
mt_short %>%
ggplot(aes(x = model, y = mpg)) +
geom_col() +
coord_flip()
p_short
Run Code Online (Sandbox Code Playgroud)
我可以通过假设项目名称是由 here::here() 生成的文件路径中“/”之后的最后一个字符串,以编程方式提取并保存项目名称。
here::here() %>% stringr::str_extract("[^/]*$")
Run Code Online (Sandbox Code Playgroud)
是否有更安全的方法以编程方式访问项目名称?类似的东西project.name(),这是一个虚构的函数?
对于pdf图形,fig.width和fig.height块选项仅更改了我的Word文档中2“ x2”图形的比例。我似乎无法控制pdf图形的大小,就像将R Markdown编织成word文档的png图形一样。
---
title: "Controlling PDF figure size in MS Word output"
output: word_document
---
```{r global_options, include=FALSE}
knitr::opts_chunk$set(fig.path='02_Figs/', fig.show='asis', dev = 'pdf',
include=FALSE, warning=FALSE, message=FALSE)
```
# Fig. 1. Small Plot
```{r include=TRUE, echo=FALSE, fig.width=2, fig.height=3, fig.keep='high'}
with(mtcars, plot(mpg~wt))
```
# Fig. 2. Big Plot
```{r include=TRUE, echo=FALSE, fig.width=4, fig.height=6, fig.keep='high'}
with(mtcars, plot(mpg~wt))
```
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个自定义函数,该函数将使用quosures作为参数连接到left_join()函数“ by = c()”部分中的参数,从而将两个数据集连接起来。
这是我目前对该函数的尝试,在“ by = c(!! left_index = !! right_index))”部分失败。left_join期望将这些参数加引号,并且用引用加引号会使!!无效。
join_by_quosure <- function(data, left_index, var_to_impute, right_index){
require(dplyr)
left_index <- enquo(left_index)
right_index <- enquo(right_index)
var_to_impute <- enquo(var_to_impute)
left_join(data,
data %>% select(!!right_index, !!var_to_impute),
by = c(!!left_index = !!right_index))
}
Run Code Online (Sandbox Code Playgroud)
我已经在下面编写了该功能如何工作的示例:
# join_by_quosure(data = mtcars, left_index = vs, var_to_impute = mpg, right_index = am)
left_join(mtcars,
mtcars %>% select(am, mpg),
by = c("vs" = "am"))
Run Code Online (Sandbox Code Playgroud)
如果有人能提供有关如何在left_join()函数的“ by = c()”部分中调用quosure的见解,我将不胜感激。
下面我编写了一个snafu()计算新变量的简单函数snafu_var。
library(dplyr)
df <- mtcars %>% select(am, cyl) %>% slice(1:5)
snafu <- function(data, var1, var2){
require(dplyr)
var1 <- enquo(var1)
var2 <- enquo(var2)
data %>% mutate(snafu_var = !!var1 + !!var2)
}
snafu(df, var1 = am, var2 = cyl)
Run Code Online (Sandbox Code Playgroud)
现在我想嵌套snafu()在另一个函数中foobar(),该函数将利用 . 创建的变量snafu()。
foobar <- function(data, var1, var2) {
require(dplyr)
data <- snafu(data, var1, var2)
data %>% mutate(foo_var = snafu_var + 1)
}
foobar(df, var1 = am, var2 = cyl)
Run Code Online (Sandbox Code Playgroud)
我在两个问题上苦苦挣扎(可能相关):
1) 中的嵌套函数 …
当我在 geom_label 中使用填充参数时,我的位置参数无效。geom_text() 不会发生这种情况。如何将填充和位置参数与 geom_label() 一起使用?
库(dplyr) 库(ggplot2)
ds_mt <-
mtcars %>%
group_by(cyl, am) %>%
summarise(mpg = mean(mpg)) %>%
ungroup() %>%
mutate_at(vars(cyl, am), funs(as.factor))
ds_mt %>%
ggplot(aes(x = cyl, fill = as.factor(am), y = mpg, label = am)) +
geom_col(position = position_dodge()) +
geom_label(position = position_dodge(width = .9))
# Adding fill argument to geom_label() nullifies the position argument
ds_mt %>%
ggplot(aes(x = cyl, fill = as.factor(am), y = mpg, label = am)) +
geom_col(position = position_dodge()) +
geom_label(fill = "white", …Run Code Online (Sandbox Code Playgroud) RStudio 支持文章称,如果您“直接使用更新 R.framework/Versions/Current 目录别名ln -s” ,您可以在 Mac 上切换不同的 R 版本
您究竟如何使用ln -sR 版本之间的更改?
当我输入终端时,ls -l /Library/Frameworks/R.framework/Versions/我看到:
total 0
drwxrwxr-x 6 root admin 192 Jan 15 09:04 3.3
drwxrwxr-x 6 root admin 192 Jun 5 16:36 3.5
drwxrwxr-x 3 root admin 96 Jun 5 16:36 3.6
lrwxr-xr-x 1 root admin 3 Jun 5 16:36 Current -> 3.5
Run Code Online (Sandbox Code Playgroud)
但我不确定如何ln -s用于在这些 R 版本之间进行切换。我目前已通过重新下载 3.5 从 3.6“切换”到 3.5。我想避免这种做法。
在我的终端中,我输入了rm /Library/Frameworks/R.framework/Versions/Current删除现有 Current.txt 的命令。然后在单独的尝试中我输入了ln …