我喜欢使用R中View()调用的源代码编辑器/数据查看器。我使用多个监视器,当我在RStudio主窗口中编写代码时,在侧面监视器上打开一个或两个查看器真的很不错。如果要查看多个数据框,必须先执行View(df),然后单击要查看的每个数据框的“在新窗口中显示”按钮,这有点不方便。
我想知道是否可以将某种包装材料放在一起,或者将某些设置藏在某个地方,这样可以做到,所以当我调用View()时,查看器会自动在新窗口中打开。有任何想法吗?
我正在foo使用map2和修改嵌套的数据框mutate,并且我想根据来在每个嵌套的数据框中命名一个变量foo$name。我不确定nse/ tidyeval取消引号的正确语法在这里。我的尝试:
library(tidyverse)
foo <- mtcars %>%
group_by(gear) %>%
nest %>%
mutate(name = c("one", "two", "three")) %>%
mutate(data = map2(data, name, ~
mutate(.x, !!(.y) := "anything")))
#> Error in quos(...): object '.y' not found
Run Code Online (Sandbox Code Playgroud)
我希望嵌套数据框中的新创建变量的名称分别为“一个”,“两个”和“三个”。
如果我对normal mutate进行普通操作df,那么我将基于普通语法使用我的尝试,name字符串在哪里:
name <- "test"
mtcars %>% mutate(!!name := "anything") # works fine
Run Code Online (Sandbox Code Playgroud)
如果成功,则以下行应返回TRUE:
foo[1,2] %>% unnest %>% names %>% .[11] == "one"
Run Code Online (Sandbox Code Playgroud) 我的问题与此类似(我想对轴上的标签使用任意文本),但ggplot我不想将值硬编码到函数中,而是想通过引用源数据集中存在的变量来提供它们。
我一直使用的解决方案是将所有ggplot代码包装在大括号内,将源数据集通过管道传输到其中,并使用以下方式引用变量.$:
library(tidyverse)
tribble(
~description, ~y, ~x,
"apples", 3.4, 1.1,
"oranges", 5.6, 2.4,
"mangos", 2.3, 4.8
) %>%
{ggplot(data = ., aes(y = y, x = x)) +
scale_x_continuous(
breaks = .$x,
labels = .$description
) +
geom_point() + geom_line()}
Run Code Online (Sandbox Code Playgroud)

这可行,但感觉像是一种解决方法。有没有规范/正确/更干净/更好的方法来做到这一点?我一直试图在文档中找到答案,但无法找到正确的关键字来描述这种情况。
(我知道这个情节是胡说八道。)
我有许多数据框和一系列我想对它们中的每一个进行的更改。对于此示例,让所需的更改只是使用as_tibble. 我知道有多种方法可以做到这一点,但我想使用purrr:walk.
对于数据框df1和df2,
df1 <- mtcars
df2 <- mtcars
Run Code Online (Sandbox Code Playgroud)
我想做相当于
df1 %<>% as_tibble
df2 %<>% as_tibble
Run Code Online (Sandbox Code Playgroud)
使用walk. 我的尝试:
library(tidyverse)
walk(c(df1, df2), ~ assign(deparse(substitute(.)), as_tibble(.)))
Run Code Online (Sandbox Code Playgroud)
这会运行但不会进行所需的更改:
is_tibble(df1)
#> [1] FALSE
Run Code Online (Sandbox Code Playgroud) 我的问题与this 问题类似,但我需要跨列应用更复杂的函数,并且我不知道如何将 Lionel 建议的解决方案应用到具有作用域动词 likefilter_at()或filter()+across()等价物的自定义函数。{{{}}}看起来并没有引入“superstache”/运算符。
这是我想要做的一个非编程示例(不使用 NSE):
library(dplyr)
library(magrittr)
foo <- tibble(group = c(1,1,2,2,3,3),
a = c(1,1,0,1,2,2),
b = c(1,1,2,2,0,1))
foo %>%
group_by(group) %>%
filter_at(vars(a,b), any_vars(n_distinct(.) != 1)) %>%
ungroup
#> # A tibble: 4 x 3
#> group a b
#> <dbl> <dbl> <dbl>
#> 1 2 0 2
#> 2 2 1 2
#> 3 3 2 0
#> 4 3 2 1
Run Code Online (Sandbox Code Playgroud)
我还没有找到filter_at与filter+相同的行across() …
我想用starts_with()识别变量,然后执行case_when变异.
例如,假设我想做相同的:
mtcars$mpg[mtcars$mpg == 21.0] <- 5; mtcars
Run Code Online (Sandbox Code Playgroud)
我的尝试:
mtcars %>%
mutate_at(
vars(starts_with("mpg")),
funs(. = case_when(
. == 21.0 ~ 5,
TRUE ~ .
))
)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?dplyr文档似乎没有很多mutate_at/mutate_each的例子(这个线程看起来有同样的抱怨),所以我很难用这些函数.也许我不是在寻找合适的地方?
我知道这个帖子但是在那里找不到解决方案.
谢谢!
我在这里和这里都知道类似的问题,但我无法找到适合我具体情况的正确解决方案.我发现的一些是使用mutate_等的解决方案,但我知道这些现在已经过时了.我对dplyr的动态用法不熟悉.
我有一个数据框,其中包含一些带有两个不同前缀的变量,alpha和beta:
df <- data.frame(alpha.num = c(1, 3, 5, 7),
alpha.char = c("a", "c", "e", "g"),
beta.num = c(2, 4, 6, 8),
beta.char = c("b", "d", "f", "h"),
which.to.use = c("alpha", "alpha", "beta", "beta"))
Run Code Online (Sandbox Code Playgroud)
我想创建前缀为"selected"的新变量.它们是"alpha"或"beta"列的副本,具体取决于在"which.to.use"列中为该行命名的列.期望的输出是:
desired.df <- data.frame(alpha.num = c(1, 3, 5, 7),
alpha.char = c("a", "c", "e", "g"),
beta.num = c(2, 4, 6, 8),
beta.char = c("b", "d", "f", "h"),
which.to.use = c("alpha", "alpha", "beta", "beta"),
chosen.num = c(1, 3, 6, 8),
chosen.char …Run Code Online (Sandbox Code Playgroud) 如何执行rowwise使用其他行的值的操作(以dplyr/tidy样式)?假设我有这个df:
df <- data_frame(value = c(5,6,7,3,4),
group = c(1,2,2,3,3),
group.to.use = c(2,3,3,1,1))
Run Code Online (Sandbox Code Playgroud)
我想创建一个新变量new.value,它等于每行的当前值加上"group"等于该行的"group.to.use"的行的最大值.所以对于第一行
new.value = 5 + (max(value[group === 2])) = 5 + 7 = 12
期望的输出:
# A tibble: 5 x 4
value group group.to.use new.value
<dbl> <dbl> <dbl> <dbl>
1 5. 1. 2. 12.
2 6. 2. 3. 10.
3 7. 2. 3. 11.
4 3. 3. 1. 8.
5 4. 3. 1. 9.
Run Code Online (Sandbox Code Playgroud)
伪代码:
df %<>%
mutate(new.value = value + max(value[group.to.use == <group.for.this.row>]))
Run Code Online (Sandbox Code Playgroud) 我将创建一个新变量,它表示许多其他变量的总和(或其他函数),这些变量都以"prefix_"开头.有没有办法使用这些select()助手(例如starts_with())整齐地做到这一点?
我不认为 mutate_at()适用于此,因为我只是试图基于许多现有变量创建一个新变量.
我的尝试:
df %<>%
mutate(newvar = sum(vars(starts_with("prefix_"))))
Run Code Online (Sandbox Code Playgroud)
这当然不起作用.非常感谢!
一个可重复的例子:
mtcars %<>%
rename("prefix_mpg" = mpg) %>%
rename("prefix_cyl" = cyl) %>%
mutate(newvar = sum(var(starts_with("prefix_"))))
Run Code Online (Sandbox Code Playgroud)
预期输出将是mtcars $ newvar,它是prefix_mpg和prefix_cyl的总和.当然我可以只明确命名mpg和cyl,但在我的实际情况中它是一个很长的变量列表,太长了,不方便命名.
group_by变量的唯一值很容易:
library(tidyverse)
library(gapminder)
gapminder %>%
group_by(year)
Run Code Online (Sandbox Code Playgroud)
如果我们想创建一个组ID只是为了向我们展示这些组将是什么:
gapminder %>%
select(year) %>%
distinct %>%
mutate(group = group_indices(., year))
A tibble: 12 x 2
year group
<int> <int>
1 1952 1
2 1957 2
3 1962 3
4 1967 4
5 1972 5
6 1977 6
7 1982 7
8 1987 8
9 1992 9
10 1997 10
11 2002 11
12 2007 12
Run Code Online (Sandbox Code Playgroud)
但是,如果我想按顺序分组("group2"),三胞胎("group3")等分组呢?我怎么能用dplyr/ tidyverse?产生以下的tibble ?
A tibble: 12 x 2
year group group2 group3 group5
<int> …Run Code Online (Sandbox Code Playgroud) 当尝试使用multicore = TRUERsurvey包中的参数时,出现以下错误:
Error in glm.control(multicore = TRUE) :
unused argument (multicore = TRUE)
Run Code Online (Sandbox Code Playgroud)
复制示例代码:
library(tidyverse)
library(survey)
mtcars %<>%
mutate(weights = 1) %>%
mutate(id = ceiling(row_number()/2)) %>%
mutate(strata = ceiling(row_number()/4))
design <- svydesign(id =~ id, weights =~ weights, strata =~ strata,
data = mtcars)
model <- svyglm(design = design, mpg ~ drat + wt + qsec,
multicore=TRUE)
Run Code Online (Sandbox Code Playgroud)
mutlicore确实作为一个可能的参数出现在 的文档中svyglm。该线程表明该参数可能不适用于 Windows,但我正在 Unix 系统上运行它。
我知道该multicore软件包已被弃用,以支持,并且此处的parallel文档表明该软件包已更新以反映此更改(请参阅修订版 3.29-5),但我不确定是否或如何涉及此问题。survey
我还尝试使用 …
我正在尝试将向量通过管道传输到all()语句中,以检查所有元素是否都等于某个值。我想我需要使用展示管道,%$%因为all()没有内置的数据参数。我的尝试导致错误:
library(tidyverse)
library(magrittr)
vec <- c("a", "b", "a")
vec %>%
keep(!grepl("b", .)) %$%
all(. == "a")
#> Error in eval(substitute(expr), data, enclos = parent.frame()): invalid 'envir' argument of type 'character'
Run Code Online (Sandbox Code Playgroud)
如果我之前打破管道all()并将输出分配给一个 object p,然后作为第二个命令传递p给all()它,它工作正常:
vec %>%
keep(!grepl("b", .)) -> p
all(p == "a")
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这有效,而我的第一次尝试却没有。我希望能够在导致TRUE.
如果vec改为 atibble以下工作:
vec <- tibble(var = c("a", "b", "a"))
vec %>%
filter(!grepl("b", var)) %$%
all(.$var …Run Code Online (Sandbox Code Playgroud)