在R中使用paste0和管道(%>%)

Aku*_*äki 1 string r dplyr

我想通过以下方式从 iris 数据集构造一个字符串向量: c("speciesvalue1 Sepal.lengthvalue1", "speciesvalue2 Sepal.lengthvalue2","speciesvalue3 Sepal.lengthvalue3"...etc.)

...此外,我只想包含 Sepal.Width 大于 3 的观察结果(即 Sepal.Width > 3)。

人们可能会认为使用管道这是一项简单的任务:

iris %>% filter(Sepal.Width > 3) %>% paste0(.$Species," ",.$Sepal.Length)
Run Code Online (Sandbox Code Playgroud)

然而,第二个管道理解这些点,但也认为它应该将整个数据帧传递给paste0作为其第一个参数,我得到这样的结果:

[1] "c(5.1, 4.7, 4.6, 5, 5.4, 4.6, 5, 4.9, 5.4, 4.8, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5, 5.5, 4.9, 5.1, 5, 4.4, 5, 5.1, 5.1, 4.6, 5.3, 5, 7, 6.4, 6.9, 6.3, 6.7, 5.9, 6, 6.7, 6.3, 7.2, 6.5, 6.4, 7.7, 6.9, 6.7, 7.2, 7.9, 6.3, 6.4, 6.9, 6.7, 6.9, 6.8, 6.7, 6.2)setosa 5.1"                    
[2] "c(3.5, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 3.1, 3.7, 3.4, 4, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3.4, 3.5, 3.2, 3.5, 3.8, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 3.1, 3.3, 3.1, 3.2, 3.4, 3.1, 3.3, 3.6, 3.2, 3.2, 3.8, 3.2, 3.3, 3.2, 3.8, 3.4, 3.1, 3.1, 3.1, 3.1, 3.2, 3.3, 3.4)setosa 4.7"    
[3] "c(1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.5, 1.5, 1.6, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1, 1.7, 1.9, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.5, 1.3, 1.3, 1.6, 1.9, 1.6, 1.4, 1.5, 1.4, 4.7, 4.5, 4.9, 4.7, 4.4, 4.8, 4.5, 4.7, 6, 6.1, 5.1, 5.3, 6.7, 5.7, 5.7, 6, 6.4, 5.6, 5.5, 5.4, 5.6, 5.1, 5.9, 5.7, 5.4)setosa 4.6"        
[4] "c(0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.1, 0.2, 0.2, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.3, 0.2, 0.6, 0.4, 0.2, 0.2, 0.2, 0.2, 1.4, 1.5, 1.5, 1.6, 1.4, 1.8, 1.6, 1.5, 2.5, 2.5, 2, 2.3, 2.2, 2.3, 2.1, 1.8, 2, 2.4, 1.8, 2.1, 2.4, 2.3, 2.3, 2.5, 2.3)setosa 5"
...
Run Code Online (Sandbox Code Playgroud)

我怎样才能防止这种情况发生?

All*_*ron 7

您可以将 括paste0在大括号中以避免数据帧作为第一个参数传递:

iris %>% 
  filter(Sepal.Width > 3) %>% 
  {paste0(.$Species," ",.$Sepal.Length)}
#>  [1] "setosa 5.1"     "setosa 4.7"     "setosa 4.6"     "setosa 5"      
#>  [5] "setosa 5.4"     "setosa 4.6"     "setosa 5"       "setosa 4.9"    
#>  [9] "setosa 5.4"     "setosa 4.8"     "setosa 5.8"     "setosa 5.7"    
#> [13] "setosa 5.4"     "setosa 5.1"     "setosa 5.7"     "setosa 5.1"    
#> [17] "setosa 5.4"     "setosa 5.1"     "setosa 4.6"     "setosa 5.1"    
#> [21] "setosa 4.8"     "setosa 5"       "setosa 5.2"     "setosa 5.2"    
#> [25] "setosa 4.7"     "setosa 4.8"     "setosa 5.4"     "setosa 5.2"    
#> [29] "setosa 5.5"     "setosa 4.9"     "setosa 5"       "setosa 5.5"    
#> [33] "setosa 4.9"     "setosa 5.1"     "setosa 5"       "setosa 4.4"    
#> [37] "setosa 5"       "setosa 5.1"     "setosa 5.1"     "setosa 4.6"    
#> [41] "setosa 5.3"     "setosa 5"       "versicolor 7"   "versicolor 6.4"
#> [45] "versicolor 6.9" "versicolor 6.3" "versicolor 6.7" "versicolor 5.9"
#> [49] "versicolor 6"   "versicolor 6.7" "virginica 6.3"  "virginica 7.2" 
#> [53] "virginica 6.5"  "virginica 6.4"  "virginica 7.7"  "virginica 6.9" 
#> [57] "virginica 6.7"  "virginica 7.2"  "virginica 7.9"  "virginica 6.3" 
#> [61] "virginica 6.4"  "virginica 6.9"  "virginica 6.7"  "virginica 6.9" 
#> [65] "virginica 6.8"  "virginica 6.7"  "virginica 6.2"
Run Code Online (Sandbox Code Playgroud)

但我可能会使用它在管道末端的数据帧中创建所需的输出作为列 - 这是一种更“tidyverse”的做事mutate方式pluck

library(tidyverse)

iris %>% 
  filter(Sepal.Width > 3) %>% 
  mutate(output = paste0(Species," ", Sepal.Length)) %>%
  pluck('output')
#>  [1] "setosa 5.1"     "setosa 4.7"     "setosa 4.6"     "setosa 5"      
#>  [5] "setosa 5.4"     "setosa 4.6"     "setosa 5"       "setosa 4.9"    
#>  [9] "setosa 5.4"     "setosa 4.8"     "setosa 5.8"     "setosa 5.7"    
#> [13] "setosa 5.4"     "setosa 5.1"     "setosa 5.7"     "setosa 5.1"    
#> [17] "setosa 5.4"     "setosa 5.1"     "setosa 4.6"     "setosa 5.1"    
#> [21] "setosa 4.8"     "setosa 5"       "setosa 5.2"     "setosa 5.2"    
#> [25] "setosa 4.7"     "setosa 4.8"     "setosa 5.4"     "setosa 5.2"    
#> [29] "setosa 5.5"     "setosa 4.9"     "setosa 5"       "setosa 5.5"    
#> [33] "setosa 4.9"     "setosa 5.1"     "setosa 5"       "setosa 4.4"    
#> [37] "setosa 5"       "setosa 5.1"     "setosa 5.1"     "setosa 4.6"    
#> [41] "setosa 5.3"     "setosa 5"       "versicolor 7"   "versicolor 6.4"
#> [45] "versicolor 6.9" "versicolor 6.3" "versicolor 6.7" "versicolor 5.9"
#> [49] "versicolor 6"   "versicolor 6.7" "virginica 6.3"  "virginica 7.2" 
#> [53] "virginica 6.5"  "virginica 6.4"  "virginica 7.7"  "virginica 6.9" 
#> [57] "virginica 6.7"  "virginica 7.2"  "virginica 7.9"  "virginica 6.3" 
#> [61] "virginica 6.4"  "virginica 6.9"  "virginica 6.7"  "virginica 6.9" 
#> [65] "virginica 6.8"  "virginica 6.7"  "virginica 6.2"
Run Code Online (Sandbox Code Playgroud)

创建于 2023-03-10,使用reprex v2.0.2


M A*_*lio 6

如果您熟悉gluesintax

iris %>% 
  filter(Sepal.Width > 3) %>% 
  glue::glue_data("{Species} {Sepal.Length}")
Run Code Online (Sandbox Code Playgroud)


ste*_*fan 5

还有另一种选择是使用magrittr 博览会管道%$%

library(dplyr, warn=FALSE)
library(magrittr)

iris %>% 
  filter(Sepal.Width > 3) %$% 
  paste(Species, Sepal.Length)
#>  [1] "setosa 5.1"     "setosa 4.7"     "setosa 4.6"     "setosa 5"      
#>  [5] "setosa 5.4"     "setosa 4.6"     "setosa 5"       "setosa 4.9"    
#>  [9] "setosa 5.4"     "setosa 4.8"     "setosa 5.8"     "setosa 5.7"    
#> [13] "setosa 5.4"     "setosa 5.1"     "setosa 5.7"     "setosa 5.1"    
#> [17] "setosa 5.4"     "setosa 5.1"     "setosa 4.6"     "setosa 5.1"    
#> [21] "setosa 4.8"     "setosa 5"       "setosa 5.2"     "setosa 5.2"    
#> [25] "setosa 4.7"     "setosa 4.8"     "setosa 5.4"     "setosa 5.2"    
#> [29] "setosa 5.5"     "setosa 4.9"     "setosa 5"       "setosa 5.5"    
#> [33] "setosa 4.9"     "setosa 5.1"     "setosa 5"       "setosa 4.4"    
#> [37] "setosa 5"       "setosa 5.1"     "setosa 5.1"     "setosa 4.6"    
#> [41] "setosa 5.3"     "setosa 5"       "versicolor 7"   "versicolor 6.4"
#> [45] "versicolor 6.9" "versicolor 6.3" "versicolor 6.7" "versicolor 5.9"
#> [49] "versicolor 6"   "versicolor 6.7" "virginica 6.3"  "virginica 7.2" 
#> [53] "virginica 6.5"  "virginica 6.4"  "virginica 7.7"  "virginica 6.9" 
#> [57] "virginica 6.7"  "virginica 7.2"  "virginica 7.9"  "virginica 6.3" 
#> [61] "virginica 6.4"  "virginica 6.9"  "virginica 6.7"  "virginica 6.9" 
#> [65] "virginica 6.8"  "virginica 6.7"  "virginica 6.2"
Run Code Online (Sandbox Code Playgroud)