小编Emm*_*man的帖子

如何通过创建虚拟变量作为折叠方法来按组汇总数据

我正在尝试按组汇总数据集,以使用虚拟列来确定每个组的值是否出现在数据的未分组的最常见值中。

作为示例,让我们flights从 中获取数据nycflights13

library(dplyr, warn.conflicts = FALSE)
library(nycflights13)

my_flights_raw <-
  flights %>%
  select(carrier, month, dest)

my_flights_raw
#> # A tibble: 336,776 x 3
#>    carrier month dest 
#>    <chr>   <int> <chr>
#>  1 UA          1 IAH  
#>  2 UA          1 IAH  
#>  3 AA          1 MIA  
#>  4 B6          1 BQN  
#>  5 DL          1 ATL  
#>  6 UA          1 ORD  
#>  7 B6          1 FLL  
#>  8 EV          1 IAD  
#>  9 B6 …
Run Code Online (Sandbox Code Playgroud)

performance r dummy-variable

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

将宽格式转为长格式,然后嵌套列

我得到了宽格式的数据。每行都与当前表外部的变量有关,以及与该变量相关的可能值。我正在尝试:(1)转为长格式,以及(2)嵌套转置值。

例子

library(tibble)

df_1 <-
  tribble(~key, ~values.male, ~values.female, ~values.red, ~values.green, ~value,
        "gender", 0.5, 0.5, NA, NA, NA,
        "age", NA, NA, NA, NA, "50",
        "color", NA, NA, TRUE, FALSE, NA,
        "time_of_day", NA, NA, NA, NA, "noon")

## # A tibble: 4 x 6
##   key         values.male values.female values.red values.green value
##   <chr>             <dbl>         <dbl> <lgl>      <lgl>        <chr>
## 1 gender              0.5           0.5 NA         NA           NA   
## 2 age                NA            NA   NA         NA           50   
## 3 color              NA            NA   TRUE       FALSE        NA …
Run Code Online (Sandbox Code Playgroud)

r tidyr tibble

9
推荐指数
1
解决办法
102
查看次数

ggplot2:当低条使文本超出条的底部时,如何有条件地更改 geom_text 的 vjust

绘制条形图时,我经常向条形图添加标签以表示每个条形图的 y 值。然而,当标准变得太低时,我会遇到麻烦,使标签不可读或丑陋。

例子


library(ggplot2)

df_blood <- data.frame(blood_type = c("O-", "O+",   "A-",   "A+",   "B-",   "B+",   "AB-",  "AB+"),
                       frequency  = c(0.13, 0.35, 0.08, 0.3, 0.02, 0.08, 0.01, 0.02))

ggplot(df_blood, aes(x = blood_type, y = frequency, fill = blood_type)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = frequency), color = "blue", vjust = 1, size = 7)
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.3.0)于 2021-01-25 创建
。查看 的栏AB-,我们可以看到文本0.01超出了栏的高度(在栏的底部)。在这种情况下,我想将vjustof更改geom_text()0.


另一个具有不同 y 尺度的示例

在这里我使用size = 7与上面相同的geom_text() …

r ggplot2 geom-text ggproto

8
推荐指数
1
解决办法
2867
查看次数

为什么使用 `scale()` 的 `mutate(across(...))` 将 [,1] 添加到列标题?

这似乎太基本了,无法在搜索中找到,但也许我没有在谷歌上使用正确的搜索词。

我想规范化数字列。当我修改该列时,mutate(across(.., scale))我被[,1]添加到标题中。这是为什么?

library(dplyr, warn.conflicts = FALSE)

mtcars_mpg_only <-
  mtcars %>%
  as_tibble() %>%
  select(mpg)

mtcars_mpg_only %>%
  as_tibble() %>%
  mutate(across(mpg, scale))
#> # A tibble: 32 x 1
#>    mpg[,1]
#>      <dbl>
#>  1   0.151
#>  2   0.151
#>  3   0.450
#>  4   0.217
#>  5  -0.231
#>  6  -0.330
#>  7  -0.961
#>  8   0.715
#>  9   0.450
#> 10  -0.148
#> # ... with 22 more rows
Run Code Online (Sandbox Code Playgroud)

但如果我使用不同的函数而不是scale()(例如,log()),则列标题保持原样:

mtcars_mpg_only %>%
  as_tibble() …
Run Code Online (Sandbox Code Playgroud)

r scale dplyr

8
推荐指数
1
解决办法
2378
查看次数

有没有更快的方法在列表中随机子集向量?

我正在寻找一种快速解决方案,用于随机子集嵌套在列表中的向量。

如果我们模拟以下数据,我们会得到一个列表l,其中包含 300 万个向量,每个向量的长度为 5。但我希望每个向量的长度有所不同。所以我想我应该应用一个随机子集每个向量的函数。问题是,这个方法并没有我希望的那么快。

模拟数据:列表l

library(stringi)

set.seed(123)
vec_n <- 15e6
vec_vals  <- 1:vec_n
vec_names <- stringi::stri_rand_strings(vec_n, 5)

my_named_vec <- setNames(vec_vals, vec_names)

split_func <- function(x, n) {
  unname(split(x, rep_len(1:n, length(x))))
}

l <- split_func(my_named_vec, n = vec_n / 5)

head(l)
#> [[1]]
#>    HmPsw    Qk8NP    Quo3T    8f0GH    nZmjN 
#>        1  3000001  6000001  9000001 12000001 
#> 
#> [[2]]
#>    2WtYS    ZaHFl    6YjId    jbGuA    tAG65 
#>        2  3000002  6000002  9000002 12000002 
#> 
#> [[3]]
#>    xSgZ6    jM5Uw    ujPOc    CTV5F …
Run Code Online (Sandbox Code Playgroud)

r list subset

7
推荐指数
1
解决办法
265
查看次数

使用 tidyverse 从列表到数据框,选择特定的列表元素

一个简单的问题,但我已经寻找了解决方案,但到目前为止无济于事。

假设我有一个列表对象,我想提取特定的列表元素并将它们作为数据框列并排输出。如何通过 tidyverse/piping 以简单的方式实现这一点?下面尝试解决。

数据

some_data <-
structure(list(x = c(23.7, 23.41, 23.87, 24.18, 24.15, 24.31, 
23.14, 23.72, 24.12, 23.47, 23.59, 23.29, 23.24, 23.5, 23.56, 
23.16, 23.62, 23.67, 23.84, 23.69, 23.7, 23.68, 24.2, 23.77, 
23.74, 23.64, 24.39, 24.05, 24.51, 23.6, 24.29, 23.31, 23.96, 
24.07, 24.37, 23.77, 23.64, 24, 23.68, 24.02, 23.36, 23.54, 23.34, 
23.69, 23.79, 23.8, 23.7, 24.45, 23.27, 23.57, 23.02, 24.23, 
23.41, 23.6, 24.02, 23.94, 24.06, 23.97, 23.38, 23.46, 24, 23.89, 
23.51, 23.72, 23.83, 23.96, 23.84, 23.52, 24.36, 23.94, 23.82, …
Run Code Online (Sandbox Code Playgroud)

r tidyverse

6
推荐指数
1
解决办法
1731
查看次数

在命令行 (shell/bash) 中将参数传递给 R 脚本:当列名包含波浪号 (~) 时该怎么办

我正在利用Rscript通过 bash 运行 R 脚本,并且我想指定要传递给脚本本身内的函数的参数。具体来说,我想传递指定的参数:

  • 数据文件的路径 ( .csv) 和
  • 该数据文件中的某些列名称。

当列名包含波浪号 ( ~)时,我遇到了问题。我试过用反引号包裹列名,但仍然不成功。

例子

我想编写一个脚本,该脚本以.csv格式接收数据文件,并根据用户的选择为一个变量绘制直方图。

这是我的功能:

plot_histogram <- function(path_to_input, x_var) {
  
  data_raw <- read.csv(file = path_to_input)
  
  path_to_output_folder <- dirname(path_to_input)
  
  png(filename = paste0(path_to_output_folder, "/", "output_plot.png"))
  
  hist(as.numeric(na.omit(data_raw[[x_var]])), main = "histogram", xlab = "my_var")
  
  replicate(dev.off(), n = 20)
}
Run Code Online (Sandbox Code Playgroud)

让我们在一些假数据上运行它

set.seed(123)
df <- data.frame(age = sample(20:80, size = 100, replace = TRUE))

write.csv(df, "some_age_data.csv")

plot_histogram(path_to_input = "some_age_data.csv",
               x_var = "age")
Run Code Online (Sandbox Code Playgroud)

正如预期的,我得到一个.png与图文件,保存到同一目录中的.csv历史

现在自定义要从命令行运行的 R …

bash shell command-line r rscript

6
推荐指数
1
解决办法
412
查看次数

如何从 waldo::compare() 返回的对象中提取突出值?

我正在尝试使用一个名为waldo的新 R 包(也参见 tidyverse 博客),该包旨在比较数据对象以查找差异。waldo::compare()根据文档,该函数返回一个对象:

类为“waldo_compare”的字符向量

此函数的主要目的是在控制台中使用,利用着色功能突出显示数据对象之间不相等的突出值。然而,虽然在控制台中检查很有用,但我确实想获取这些值并对其采取行动(从数据中过滤掉它们等)。因此,我想以编程方式提取突出的值。我不知道怎么做

例子

  1. 生成长度为 10 的向量:
set.seed(2020)

vec_a <- sample(0:20, size = 10)

## [1]  3 15 13  0 16 11 10 12  6 18
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个重复向量,并将附加值 ( 4)添加到第 11 个向量元素中。
vec_b <- vec_a
vec_b[11] <- 4
vec_b <- as.integer(vec_b) 

## [1]  3 15 13  0 16 11 10 12  6 18  4
Run Code Online (Sandbox Code Playgroud)
  1. 使用waldo::compare()测试两个向量之间的差异
waldo::compare(vec_a, vec_b)

## `old[8:10]`: 12 6 18  
## `new[8:11]`: 12 6 18 4 …
Run Code Online (Sandbox Code Playgroud)

comparison compare r

6
推荐指数
2
解决办法
190
查看次数

在 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
查看次数

如何在 2 列表中找到所有可能的集合对之间的交集?

我想计算集合之间的重叠系数。我的数据是一个 2 列表,例如:

\n
df_example <- \n  tibble::tribble(~my_group, ~cities,\n                   "foo",   "london",\n                   "foo",   "paris", \n                   "foo",   "rome", \n                   "foo",   "tokyo",\n                   "foo",   "oslo",\n                   "bar",   "paris", \n                   "bar",   "nyc",\n                   "bar",   "rome", \n                   "bar",   "munich",\n                   "bar",   "warsaw",\n                   "bar",   "sf", \n                   "baz",   "milano",\n                   "baz",   "oslo",\n                   "baz",   "sf",  \n                   "baz",   "paris")\n
Run Code Online (Sandbox Code Playgroud)\n

在 中df_example,我有 3 个集合(即 、foobarbaz,每个集合的成员在cities

\n

我希望最终得到一个与所有可能的集合对相交的表,并指定每对中较小集合的大小。这将导致计算重叠系数每对集合的

\n

(重叠系数=共同成员数/较小集合的大小)

\n

所需输出

\n
## # A tibble: 3 \xc3\x97 4\n##   combination n_instersected_members size_of_smaller_set …
Run Code Online (Sandbox Code Playgroud)

r set-intersection dplyr

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