标签: tidyverse

tidyverse:绑定相同维度的列表元素

使用reduce(bind_cols),可以组合相同维度的列表元素。但是,我想知道如何从可能具有不同维度元素的列表中仅组合相同维度(可能以某种方式指定维度)的元素。

library(tidyverse)

df1 <- data.frame(A1 = 1:10, A2 = 10:1)
df2 <- data.frame(B = 11:30)
df3 <- data.frame(C = 31:40)

ls1 <- list(df1, df3)
ls1

[[1]]
   A1 A2
1   1 10
2   2  9
3   3  8
4   4  7
5   5  6
6   6  5
7   7  4
8   8  3
9   9  2
10 10  1

[[2]]
    C
1  31
2  32
3  33
4  34
5  35
6  36
7  37
8  38
9  39 …
Run Code Online (Sandbox Code Playgroud)

reduce r dplyr purrr tidyverse

16
推荐指数
4
解决办法
564
查看次数

使用标准评估和do_在没有do.call的参数网格上运行模拟

目标

我想使用dplyr在参数网格上运行模拟.具体来说,我想要一个我可以在另一个程序中使用的函数

  • 传递一个data.frame
  • 对于每一行,使用每列作为参数计算一些模拟
  • 也传递了一些额外的数据(例如,初始条件)

这是我的方法

require(dplyr)
run <- function(data, fun, fixed_parameters, ...) {
   ## ....
   ## argument checking
   ##

   fixed_parameters <- as.environment(fixed_parameters)
   grouped_out <- do_(rowwise(data), ~ do.call(fun, c(., fixed_parameters, ...)))
   ungroup(grouped_out)
 }
Run Code Online (Sandbox Code Playgroud)

这有效.例如,对于

growth <- function(n, r, K, b) {
  # some dynamical simulation
  # this is an obviously-inefficient way to do this ;)
  n  + r - exp(n) / K - b - rnorm(1, 0, 0.1)
}
growth_runner <- function(r, K, b, ic, ...) {
  # a wrapper …
Run Code Online (Sandbox Code Playgroud)

simulation design-patterns r tidyverse

15
推荐指数
2
解决办法
557
查看次数

R purrr ::: pmap:如何按名称引用输入参数?

purrr:::pmap用三个输入R.目前尚不清楚我如何在公式调用中明确引用这些输入?使用map2时,公式调用如下~ .x + .y.但使用时该怎么办pmap

http://r4ds.had.co.nz/lists.html转载Hadley的例子

library(purrr)
mu <- list(5, 10, -3)
sigma <- list(1, 5, 10)
n <- list(1, 3, 5)

args2 <- list(mean = mu, sd = sigma, n = n)
pmap(args2, rnorm)
Run Code Online (Sandbox Code Playgroud)

如果我想在调用时显式引用输入参数rnorm,我可以使用:

pmap(args2, function(mean, sd, n) rnorm(n, mean, sd))
Run Code Online (Sandbox Code Playgroud)

但是说我想用公式方法做到这一点.我怎么做?例如,这不起作用:

pmap(args2, ~rnorm(n=.n, mean=.mean, sd=.sd))
Run Code Online (Sandbox Code Playgroud)

谢谢!!

r purrr tidyverse

15
推荐指数
3
解决办法
5510
查看次数

为多个标记变量设置缺失值

如何为数据框中的多个标记向量设置缺失值.我正在使用spss的调查数据集.我正在处理大约20个不同的变量,具有相同的缺失值.所以想找到一种方法来使用lapply()来完成这项工作,但我不能.

我实际上可以用基数R通过as.numeric()然后重新编码()来做到这一点,但我对避风港和标记类的可能性很感兴趣所以我想在Hadley的tidyverse中找到一种方法来做到这一切

大致相关的变量看起来像这样.如果这是一个基本问题,我很抱歉,但我发现与避风港相关联的帮助文档和标记的包只是非常无益.

library(haven)
library(labelled)
v1<-labelled(c(1,2,2,2,5,6), c(agree=1, disagree=2, dk=5, refused=6))
v2<-labelled(c(1,2,2,2,5,6), c(agree=1, disagree=2, dk=5, refused=6))
v3<-data.frame(v1=v1, v2=v2)
lapply(v3, val_labels)
lapply(v3, function(x) set_na_values(x, c(5,6)))
Run Code Online (Sandbox Code Playgroud)

r r-haven tidyverse

15
推荐指数
2
解决办法
1990
查看次数

tidyverse 未加载,它显示“命名空间 'vctrs' 0.2.0 已加载,但需要 &gt;= 0.2.1”

强文本我在安装包时不断遇到问题tidyverse,这使我无法执行许多文本处理任务。这个问题与 2017 年以来许多以前的线程中提到的问题相同,当我输入library(tidyverse)或尝试打开其他相关包时,他们总是说它需要 0.2.1 版本的vctrs. 我尝试过使用remote下载或下载其他临时版本但无济于事。有人可以帮我解决这个问题吗?

\n

我正在使用最新版本的 R(版本 3.6.1),在 Rstudio 1.2.5033 上运行。我还更新了我的vctrs包。

\n
install.packages("tidyverse")\ndevtools::install_github("tidyverse/tidyverse")\nlibrary(tidyverse)\nError: package or namespace load failed for \xe2\x80\x98tidyverse\xe2\x80\x99 in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]):\n namespace \xe2\x80\x98vctrs\xe2\x80\x99 0.2.0 is already loaded, but >= 0.2.1 is required\nIn addition: Warning message:\npackage \xe2\x80\x98tidyverse\xe2\x80\x99 was built under R version 3.6.2 \n\n\nlibrary(devtools)\ndevtools::install_github("tidyverse/tidyverse")\nlibrary(tidyverse)\nError: package or namespace load failed for \xe2\x80\x98tidyverse\xe2\x80\x99 in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]):\n namespace \xe2\x80\x98vctrs\xe2\x80\x99 0.2.0 is …
Run Code Online (Sandbox Code Playgroud)

r devtools tidyverse vctrs

15
推荐指数
2
解决办法
4万
查看次数

tidyverse - 将命名向量转换为data.frame/tibble的首选方法

使用tidyverse了很多我经常面临的挑战是将命名向量转换为data.frame/ tibble,其中列是向量的名称.
这样做的首选/ tidyverse方式是什么?
编辑:这与:这个 github问题有关

所以我想:

require(tidyverse)
vec <- c("a" = 1, "b" = 2)
Run Code Online (Sandbox Code Playgroud)

成为这个:

# A tibble: 1 × 2
      a     b
  <dbl> <dbl>
1     1     2
Run Code Online (Sandbox Code Playgroud)

我可以通过例如:

vec %>% enframe %>% spread(name, value)
vec %>% t %>% as_tibble
Run Code Online (Sandbox Code Playgroud)

用例:

require(tidyverse)
require(rvest)
txt <- c('<node a="1" b="2"></node>',
         '<node a="1" c="3"></node>')

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(~t(.) %>% as_tibble)
Run Code Online (Sandbox Code Playgroud)

这使

# A tibble: 2 × 3
      a     b     c …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyr purrr tidyverse

14
推荐指数
2
解决办法
3155
查看次数

data.table相当于tidyr :: complete()

tidyr::complete()将行添加到a data.frame中,以获取数据中缺少的列值组合.例:

library(dplyr)
library(tidyr)

df <- data.frame(person = c(1,2,2),
                 observation_id = c(1,1,2),
                 value = c(1,1,1))
df %>%
  tidyr::complete(person,
                  observation_id,
                  fill = list(value=0))
Run Code Online (Sandbox Code Playgroud)

产量

# A tibble: 4 × 3
  person observation_id value
   <dbl>          <dbl> <dbl>
1      1              1     1
2      1              2     0
3      2              1     1
4      2              2     1
Run Code Online (Sandbox Code Playgroud)

其中value组合person == 1observation_id == 2缺少的组合df已填入值0.

什么相当于这个data.table

r data.table tidyr tidyverse

14
推荐指数
2
解决办法
1173
查看次数

as.tibble(),as_data_frame()和tbl_df()之间有什么区别?

我记得读书的地方,as.tibble()是一个别名as_data_frame(),但我不知道到底是什么的别名是在编程术语.它与包装器类似吗?

所以我想我的问题大概可以归结为在两者之间可能的用法区别tbl_df()as_data_frame():什么是它们之间的区别,如果有的话?

更具体地说,给定(非tibble)数据帧df,我经常使用以下方法将其转换为tibble:

df <- tbl_df(df)
Run Code Online (Sandbox Code Playgroud)

岂不

df <- as_data_frame(df)
Run Code Online (Sandbox Code Playgroud)

做同样的事?如果是这样,是否存在其他两种功能tbl_df()并且as_data_frame()不能互换使用以获得相同结果的情况?

R文件说,

tbl_df() 将论证转发给 as_data_frame()

这是否意味着它tbl_df()是一个包装或别名as_data_frame()?R文档似乎没有说什么as.tibble(),我忘记了我读到它的别名as_data_frame().此外,显然 as_tibble()是另一个别名as_data_frame().

如果这四个函数的功能完全相同,那么赋予一个函数四个不同名称的意义何在?这不是更有说服力而不是有用吗?

terminology r dplyr tidyverse tibble

14
推荐指数
1
解决办法
1万
查看次数

使用tidyverse; 在组内变化之前和之后计数,为每个唯一班次生成新变量

我正在寻找一个tidyverse -solution,它可以计算数据数据中TF组内唯一值的出现次数.当我想要从那一点向前和向后计算变化时.此计数应存储在一个新变量中,以便为每个唯一的移位保存加号和减号.idtblTFPM##PM##TF

这个问题类似于我之前提出的问题,但在这里我特意寻找使用tidyverse工具的解决方案.Uwe data.table 在这里使用了一个优雅的答案.

如果这个问题违反了任何SO政策,请告诉我,我会很乐意重新打开我的初步问题,或者附上一个赏金问题.

用一个最小的工作例来说明我的问题.我有这样的数据,

# install.packages(c("tidyverse"), dependencies = TRUE)
library(tibble)

tbl <- tibble(id = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
                     1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7), 
              TF = c(NA, 0, NA, 0, 0, 1, 1, 1, NA, 0, 0, …
Run Code Online (Sandbox Code Playgroud)

r dplyr tidyr tidyverse

14
推荐指数
2
解决办法
686
查看次数

R 中对大数据集有哪些有用的优化?

我构建了一个脚本,它适用于小数据集(<1 M 行),但在大数据集上表现很差。我听说数据表比 tibbles 性能更高。除了了解数据表之外,我还有兴趣了解其他速度优化。

我将在脚本中分享几个命令作为示例。在每个示例中,数据集有 10 到 1500 万行和 10 到 15 列。

  1. 获取按九个变量分组的数据框的最低日期
      dataframe %>% 
      group_by(key_a, key_b, key_c,
               key_d, key_e, key_f,
               key_g, key_h, key_i) %>%
      summarize(min_date = min(date)) %>% 
      ungroup()
Run Code Online (Sandbox Code Playgroud)
  1. 对两个数据框进行左连接以添加额外的列
      merge(dataframe, 
          dataframe_two, 
          by = c("key_a", "key_b", "key_c",
               "key_d", "key_e", "key_f",
               "key_g", "key_h", "key_i"),
          all.x = T) %>% 
      as_tibble()
Run Code Online (Sandbox Code Playgroud)
  1. 最近的日期加入两个数据框
      dataframe %>%
      left_join(dataframe_two, 
                  by = "key_a") %>%
      group_by(key_a, date.x) %>%
      summarise(key_z = key_z[which.min(abs(date.x - date.y))]) %>%
      arrange(date.x) %>%
      rename(day = date.x)
Run Code Online (Sandbox Code Playgroud)

我可以应用哪些最佳实践,特别是我可以做些什么来使这些类型的函数针对大型数据集进行优化?

——

这是一个示例数据集

set.seed(1010)
library("conflicted") …
Run Code Online (Sandbox Code Playgroud)

r dplyr data.table tidyverse

14
推荐指数
2
解决办法
487
查看次数