【问题标题】:dplyr: Why do some operations work "rowwise" without calling rowwise() and others dont?dplyr:为什么有些操作在不调用 row wise() 的情况下“按行”工作,而其他操作却不行?
【发布时间】:2023-01-08 00:46:09
【问题描述】:

我仍在努力弄清楚rowwise 在 R/dplyr 中是如何工作的。

例如我有这段代码:

library(dplyr)
df = data.frame(
  group = c("a", "a", "a", "b", "b", "c"),
  var1 = 1:6,
  var2 = 7:12
)

df %>%
  mutate(
    concatNotRW = paste0(var1, "-", group), # work on rows
    meanNotRW = mean(c(var1, var2)), # works not on rows
    charsNotRW = strsplit(concatNotRW, "-") # works on rows
  ) %>%
  rowwise() %>%
  mutate(
    concatRW = paste0(var1, "-", group), # all work on rows
    meanRW = mean(c(var1, var2)),
    charsRW = strsplit(concatRW, "-")
  ) -> res

res 数据框如下所示:

  group  var1  var2 concatNotRW meanNotRW charsNotRW concatRW meanRW chars    
  <chr> <int> <int> <chr>           <dbl> <list>     <chr>     <dbl> <list>   
1 a         1     7 1-a               6.5 <chr [2]>  1-a           4 <chr [2]>
2 a         2     8 2-a               6.5 <chr [2]>  2-a           5 <chr [2]>
3 a         3     9 3-a               6.5 <chr [2]>  3-a           6 <chr [2]>
4 b         4    10 4-b               6.5 <chr [2]>  4-b           7 <chr [2]>
5 b         5    11 5-b               6.5 <chr [2]>  5-b           8 <chr [2]>
6 c         6    12 6-c               6.5 <chr [2]>  6-c           9 <chr [2]>

我不明白的是为什么paste0 可以获取一行中的每个单元格并将它们粘贴在一起(本质上执行逐行操作),但 mean 不能那样做。我错过了什么,是否有任何关于在不调用 rowwise() 的情况下已经按行工作的规则?我没有在 rowwise()-vignette here https://dplyr.tidyverse.org/articles/rowwise.html 中找到这么多信息

【问题讨论】:

    标签: r dplyr rowwise


    【解决方案1】:

    paste 可以将向量作为可变参数(...)的输入并返回与向量相同的长度,而mean 将可变参数用于其他输入(trim 等)并返回单个值。这里我们需要rowMeans。关于strsplit,返回一个list的split元素

    library(dplyr)
    df %>%
      mutate(
        concatNotRW = paste0(var1, "-", group),
        meanNotRW = rowMeans(across(c(var1, var2))),
        charsNotRW = strsplit(concatNotRW, "-") 
      )
    

    > mean(c(1:5, 6:10))
    [1] 5.5
    

    请注意,我们传递的向量是单个向量 concatenating 两个向量 1:5 和 6:10

    然而

    > paste(1:5, 6:10)
    [1] "1 6"  "2 7"  "3 8"  "4 9"  "5 10"
    

    是传递到 paste 中的两个向量


    要将列拆分为两列,我们可以使用separate

    library(tidyr)
     df %>%
      mutate(
        concatNotRW = paste0(var1, "-", group),
        meanNotRW = rowMeans(across(c(var1, var2)))) %>% 
        separate(concatNotRW, into = c("ind", "chars"))
     group var1 var2 ind chars meanNotRW
    1     a    1    7   1     a         4
    2     a    2    8   2     a         5
    3     a    3    9   3     a         6
    4     b    4   10   4     b         7
    5     b    5   11   5     b         8
    6     c    6   12   6     c         9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      相关资源
      最近更新 更多