【问题标题】:R mutate() working with paste0()R mutate() 与 paste0() 一起工作
【发布时间】:2018-09-29 11:32:59
【问题描述】:

我刚刚观察到一个非常奇怪的行为,在比较 paste0pastemutate 应用时我无法解释:

mtcars %>% group_by(cyl) %>% ungroup() %>% mutate(`newcol ss` = paste0(as.character(wt), as.character(drat), collapse=";"))

上面这段代码使用paste0的输出如下:

mtcars %>% group_by(cyl) %>% ungroup() %>% mutate(`newcol ss` = paste(as.character(wt), as.character(drat)))

paste()函数的输出如下:

基本上 mutate 与 paste(逐行合并两列)效果很好,而 paste0 将所有列和行合并到一个单元格中。

【问题讨论】:

  • 你为什么要为这么复杂的代码而烦恼?你不能用mtcars$ss <- paste0(mtcars$wt, mtcars$drat, sep = " ")
  • paste0 也指定了折叠,而 paste 没有...这就是为什么 rdocumentation.org/packages/base/versions/3.4.3/topics/paste
  • 如果您使用mtcars %>% group_by(cyl) %>% ungroup() %>% mutate(`newcol ss` = paste(as.character(wt), as.character(drat), collapse = ";")),它也会合并整个wtdrat 列。所以pastepaste0之间没有区别。
  • @griffinevo 对复杂的代码感到抱歉,只是尝试重现我在项目中遇到的相同问题。但在这里我的问题是为什么所有列都在第一个场景中组合在一起。
  • 崩溃论点 - 正如我的回答中所述 - 在您的两种情况下也不相等。这就是造成差异的原因。

标签: r dplyr


【解决方案1】:

删除collapse(并在paste0函数内添加" ")以匹配您使用paste时的结果:

mtcars %>% group_by(cyl) %>% ungroup() %>% mutate(`newcol ss` = paste0(as.character(wt), " ", as.character(drat)))

您也可以使用 paste 产生奇怪的结果:

mtcars %>% group_by(cyl) %>% ungroup() %>% mutate(`newcol ss` = paste(as.character(wt), as.character(drat), collapse = ";"))

> mtcars %>% group_by(cyl) %>% ungroup() %>% mutate(`newcol ss` = paste(as.character(wt), as.character(drat), collapse = ";"))
# A tibble: 32 x 13
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb ss           `newcol ss`                                                         
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>        <chr>                                                               
 1  21.0    6.  160.  110.  3.90  2.62  16.5    0.    1.    4.    4. "2.623.9 "   2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 2  21.0    6.  160.  110.  3.90  2.88  17.0    0.    1.    4.    4. "2.8753.9 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 3  22.8    4.  108.   93.  3.85  2.32  18.6    1.    1.    4.    1. "2.323.85 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 4  21.4    6.  258.  110.  3.08  3.22  19.4    1.    0.    3.    1. "3.2153.08 " 2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 5  18.7    8.  360.  175.  3.15  3.44  17.0    0.    0.    3.    2. "3.443.15 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 6  18.1    6.  225.  105.  2.76  3.46  20.2    1.    0.    3.    1. "3.462.76 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 7  14.3    8.  360.  245.  3.21  3.57  15.8    0.    0.    3.    4. "3.573.21 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 8  24.4    4.  147.   62.  3.69  3.19  20.0    1.    0.    4.    2. "3.193.69 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
 9  22.8    4.  141.   95.  3.92  3.15  22.9    1.    0.    4.    2. "3.153.92 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
10  19.2    6.  168.  123.  3.92  3.44  18.3    1.    0.    4.    4. "3.443.92 "  2.62 3.9;2.875 3.9;2.32 3.85;3.215 3.08;3.44 3.15;3.46 2.76;3.57 3.~
# ... with 22 more rows

我个人会使用不太复杂的代码:

mtcars$ss <- paste0(mtcars$wt, " ", mtcars$drat)

【讨论】:

    【解决方案2】:

    collapse = ", " 是问题的原因。

    尝试将collapse 放入paste 中,将获得相同的结果,只是两列的值之间会添加空格。

    导致结果不同的不是pastepaste0 的差异。

    尝试了解pastepaste0 的用法以及collapse 的用法。

    [[正如 griffinevo 和 Kim 在上面的 cmets 中提到的,坚持使用更简单的代码。 ]]

    【讨论】:

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