小编Emm*_*man的帖子

如何将科学记数法转换为小数点的十进制?

虽然很基本,但我在任何地方都找不到答案:如何在小标题中禁用科学记数法,而让小标题显示小数?

我的资料

我有一个简单的 tibble,由lm() %>% broom::tidy().

library(tidyverse)

## I used dput() to get this:

tidy_lm_output <- structure(list(term = c("(Intercept)", "mood", "sleep"), estimate = c(-0.00000000000000028697849703988, 
-0.0746522106739049, 0.835867664974019), std.error = c(0.0319620048196539, 
0.0464197056030362, 0.0464197056030362), statistic = c(-0.00000000000000897873893265334, 
-1.60820086435494, 18.006742053085), p.value = c(0.999999999999993, 
0.108628280589954, 9.41480010964234e-53)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

> tidy_lm_output
## # A tibble: 3 x 5
##  term         estimate std.error statistic   p.value
##   <chr>           <dbl>     <dbl>     <dbl>     <dbl>
## 1 (Intercept) -2.87e-16    0.0320 -8.98e-15 10.00e- …
Run Code Online (Sandbox Code Playgroud)

r tibble

5
推荐指数
1
解决办法
1640
查看次数

为条形图定义固定宽度/高度,然后设置条形图的绝对宽度以及条形图之间的绝对间距(以像素为单位)

我想使用它生成条形图,ggplot2它将遵循严格的标准:

  • 它们必须具有一定的尺寸(宽度和高度)
  • 条形的宽度必须固定(以像素为单位),无论图中有多少条形
  • 无论条形数量多少,条形之间的间距必须固定(以像素为单位)

我使用 RStudio,它允许其查看器具有响应能力。这意味着当我扩大观看者的边界时,绘图也会相应拉伸,增加条形的宽度和条形之间的间距。相反,缩小观察者的边界将使条形变细并减少条形之间的空间。

类似地,在给定的查看器边界内,绘制条形图将产生 6 个条形与仅 2 个条形不同的条形宽度。

示范

library(ggplot2)
library(dplyr)

p_all_bars <- 
  mpg %>%
  ggplot(aes(x = class)) +
  geom_bar()

p_two_bars <-
  mpg %>%
  filter(class == "compact" | class == "suv") %>%
  ggplot(aes(x = class)) +
  geom_bar()
Run Code Online (Sandbox Code Playgroud)
p_all_bars
Run Code Online (Sandbox Code Playgroud)

p_all_bars

p_two_bars
Run Code Online (Sandbox Code Playgroud)

p_two_bars


如果我保存尺寸为 的两个width = 1000 pixels图,height = 650 pixels很明显,一个图(7 个条)与另一个图(2 个条)的条形宽度条形之间的间距都不同。

全部_7


2_条

底线

如何设置图的高度和宽度(以像素为单位)以及条形的宽度和条形之间的间距(以像素为单位)的绝对值 - 无论图中的条形数量如何?

r bar-chart ggplot2

5
推荐指数
1
解决办法
2233
查看次数

在 dplyr 中,如何按可能存在或不存在的列连接数据帧?

我有两个想要加入的数据框架。虽然我总是有一个主要的共同列可供加入,但有时除了主列之外,我可能还想在数据中加入另一列。

我如何指定一个可能的列来加入?

例子

我用来自 的两个数据集演示了我的问题mtcars。两者都有一个我始终会加入的“主”列 ( cars),有时some_letters在一个或两个数据集中可能还有另一个共同列 ( )。

library(tidyverse)

create_df <- function(columns_to_include) {
  
  mtcars %>%
    rownames_to_column("cars") %>%
    select(cars, {{ columns_to_include }}) %>%
    slice_sample(n = 15) %>%
    {if (sample(c(TRUE, FALSE), size = 1)) add_column(., some_letters = letters[1:15]) else .}
}

# both dataframes have "some_letters"
set.seed(123)
df_a1 <- create_df(carb)
df_a2 <- create_df(gear)
scenario_a <- inner_join(df_a1, df_a2, by = c("cars", "some_letters"))
scenario_a
#>             cars carb some_letters gear
#> 1 Ford …
Run Code Online (Sandbox Code Playgroud)

merge r inner-join dplyr

5
推荐指数
1
解决办法
568
查看次数

如何为数据整理编写有效的包装器,允许在调用包装器时关闭任何包装的部分

为了简化数据整理,我编写了一个由处理数据的几个“动词函数”组成的包装函数。每个人对数据执行一项任务。但是,并非所有任务都适用于通过此过程的所有数据集,有时,对于某些数据,我可能想关闭一些“动词功能”,并跳过它们。

我试图了解是否有一种传统/规范的方式来在 R 的包装器函数中构建这样的工作流。重要的是,一种高效的方式,无论是性能方面还是简洁的代码。

例子

作为数据整理的一部分,我想执行几个步骤:

  1. 清理列标题(使用janitor::clean_names()
  2. 重新编码数据中的值,这样TRUEFALSE被替换为10(使用gsub())。
  3. 将字符串值重新编码为小写(使用tolower())。
  4. 根据特定id列旋转更宽(使用tidyr::pivot_wider
  5. 删除带有NA值的行(使用dplyr::drop_na()

玩具数据

library(stringi)
library(tidyr)

set.seed(2021)

# simulate data
df <-
  data.frame(id = 1:20,
           isMale = rep(c("true", "false"), times = 10),
           WEIGHT = sample(50:100, 20),
           hash_Numb = stri_rand_strings(20, 5)) %>%
  cbind(., score = sample(200:800, size = 20))

# sprinkle NAs randomly
df[c("isMale", "WEIGHT", "hash_Numb", "score")] …
Run Code Online (Sandbox Code Playgroud)

r function wrapper user-defined-functions data-wrangling

5
推荐指数
1
解决办法
208
查看次数

使用“{data.table}”编程:如何命名新列?

下面的问题在编程中似乎非常基本data.table,所以如果它是重复的,我很抱歉。我花了时间研究但找不到答案。

我想创建一个“用户定义的函数”来包装data.table争论过程。在此过程中,创建了一个新列,我想让用户设置该新列的名称。

例子

考虑以下按原样工作的代码。我想将它包装在一个函数中。

library(data.table)
library(magrittr)
library(tibble)

mtcars %>%
  as.data.table() %>%
  .[, .(max_mpg = max(mpg)), by = cyl] %>%
  as_tibble()
#> # A tibble: 3 x 2
#>     cyl max_mpg
#>   <dbl>   <dbl>
#> 1     6    21.4
#> 2     4    33.9
#> 3     8    19.2
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2021 年 10 月 13 日创建(v0.3.0)

我希望我的函数做的就是让用户设置以下名称new_colname_of_choice

my_wrapper <- function(new_colname_of_choice) {
  mtcars %>%
    as.data.table() %>%
    .[, .(new_colname_of_choice = max(mpg)), by = cyl] %>%
    as_tibble()
}


my_wrapper(new_colname_of_choice …
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
1
解决办法
246
查看次数

当我使用“dplyr::mutate()”时,为什么“furrr::future_map_int()”比“purrr::map_int()”慢?

我有一个tibble,其中包含一个列表列,其中包含向量。我想创建一个新列来说明每个向量的长度。由于这个数据集很大(3M 行),我想使用该包来减少一些处理时间furrr。不过,看起来purrr比 更快furrr。怎么会?

为了演示这个问题,我首先模拟一些数据。不要费心去理解模拟部分的代码,因为它与问题无关。


数据模拟功能

library(stringi)
library(rrapply)
library(tibble)

simulate_data <- function(nrows) {
  split_func <- function(x, n) {
    unname(split(x, rep_len(1:n, length(x))))
  }
  
  randomly_subset_vec <- function(x) {
    sample(x, sample(length(x), 1))
  }
  
  tibble::tibble(
    col_a = rrapply(object = split_func(
      x = setNames(1:(nrows * 5),
                   stringi::stri_rand_strings(nrows * 5,
                                              2)),
      n = nrows
    ),
    f      = randomly_subset_vec),
    col_b = runif(nrows)
  )
  
} 
Run Code Online (Sandbox Code Playgroud)

模拟数据

set.seed(2021)

my_data <- simulate_data(3e6) # takes about 1 minute to run on my …
Run Code Online (Sandbox Code Playgroud)

r purrr furrr

5
推荐指数
1
解决办法
609
查看次数

使用 tidyr::unnest_wider() 时,如何根据 chr 向量命名新列

我有以下数据结构:

library(tibble)

my_tbl <-
  tibble::tribble(
                   ~col_x,   ~col_y,
                   "a",      list(1, 2, 3),
                   "b",      list(4, 5, 6),
                   "c",      list(7, 8, 9)
                   )
Run Code Online (Sandbox Code Playgroud)

我想用它来tidyr::unnest_wider()分隔col_y列。这些新列的名称应取自animal_names向量:

animal_names <- c("dog", "cat", "zebra")
Run Code Online (Sandbox Code Playgroud)

我如何利用unnest_wider()应用来自 的名称animal_names,从而避免以下命名警告:

library(tidyr)

my_tbl %>%  
  unnest_wider(col_y)
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
#> New names:
#> * `` -> ...1
#> * `` -> ...2
#> * `` -> ...3
#> New …
Run Code Online (Sandbox Code Playgroud)

r unnest tidyr

5
推荐指数
1
解决办法
1440
查看次数

检测向量是否至少有一个非 NA 元素的最快方法是什么?(即与 `base::anyNA()` 相反)

正如我们从这个答案anyNA()中了解到的那样,当使用overany(is.na())来检测向量是否至少有一个元素时,性能会得到显着提高NA。这是有道理的,因为 的算法在找到anyNA()第一个值后停止,而必须首先运行整个向量。NAany(is.na())is.na()

相比之下,我想知道一个向量是否至少有 1 个NA。这意味着我正在寻找一种在第一次遇到非值后停止的实现NA。是的,我可以使用,但随后我面临着首先运行整个向量的any(!is.na())问题。is.na()

是否存在与 等效的相反性能anyNA(),即“anyNonNA()”?

r na

5
推荐指数
1
解决办法
137
查看次数

在 ggplot 中,如何使用尖边(如“牙签”)创建线条可视化?

我正在寻找一种方法来创建ggplot()具有“尖”边缘的线条,以获得“牙签”的整体外观。

例如,考虑以下可视化:

library(tibble)
library(ggplot2)

my_df <-
  tribble(~name, ~value,
        "a", 1,
        "a", 2,
        "b", 1,
        "b", 2)


my_df %>%
  ggplot(aes(x = name, y = value)) +
  geom_line(size = 1.5, lineend = "round") +
  expand_limits(y = c(0.5, 2.5)) +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

reprex 包( v2.0.0 )于 2021 年 7 月 21 日创建


现在,假设我设置了

y_top    <- 1.75
y_bottom <- 1.25
Run Code Online (Sandbox Code Playgroud)

作为线条开始“锐化”的值。
我怎样才能得到类似的东西:
牙签

虽然也有淡出效果是理想的,但“牙签”外观对我来说是最重要的。不幸的是,geom_lines()lineend论点不支持我正在寻找的“尖锐性”。

知道如何实现这一目标吗?

谢谢!

r ggplot2

4
推荐指数
1
解决办法
169
查看次数

如何使用ggplot在圆内随机散布点,而不会围绕中心聚集?

我想用来ggplot画一个圆,然后在里面散点。我有代码(从这个答案中采用)让我非常接近我想要的。但是,我希望点随机散布在圆圈内,但现在我在中心周围出现了一个不需要的簇。

我看到了一个类似的 SO question and answer,但它是在 c# 中,我不明白如何使其适应R代码。

到目前为止我的代码

下面的代码定义了一个自定义的可视化函数vis_points_inside_circle(),然后调用了4次,给出了4个使用我当前方法可视化的例子。

library(ggplot2)
library(ggforce)

## set up function
vis_points_inside_circle <- function(n) {
  
  # part 1 -- set up empty circle
  df_empty_circle <-
    data.frame(x = 0,
               y = 0, 
               r = 1)
  
  p_empty_circle <-
    ggplot(df_empty_circle) +
    geom_circle(aes(x0 = x, y0 = y, r = r)) + 
    coord_fixed() +
    theme_void()
  
  # part 2 -- set up points scatter
  r <- runif(n)
  th …
Run Code Online (Sandbox Code Playgroud)

geometry trigonometry r ggplot2 polar-coordinates

4
推荐指数
1
解决办法
52
查看次数