如何在paste()中使用dplyr的“选择助手”?

时间:2017-06-19 23:58:19

标签: r dplyr paste

这很好用,但很麻烦。

> library(dplyr)
> mutate(iris, a = paste( Petal.Width, Petal.Length) ) %>>% head
Sepal.Length Sepal.Width Petal.Length Petal.Width Species       a
 1          5.1         3.5          1.4         0.2  setosa 0.2 1.4
 2          4.9         3.0          1.4         0.2  setosa 0.2 1.4
 3          4.7         3.2          1.3         0.2  setosa 0.2 1.3
 4          4.6         3.1          1.5         0.2  setosa 0.2 1.5
 5          5.0         3.6          1.4         0.2  setosa 0.2 1.4
 6          5.4         3.9          1.7         0.4  setosa 0.4 1.7

如何在paste()中使用dplyr的“选择助手”?

> mutate(iris, a = paste( starts_with("Petal") ))
Error in mutate_impl(.data, dots) : 
  wrong result size (0), expected 150 or 1
> mutate_(iris, a = paste( starts_with("Petal") ))
Error in parse(text = x)[[1]] : subscript out of bounds
> mutate_(iris, a = paste( starts_with(Petal) ))
Error in is.string(match) : object 'Petal' not found
> mutate(iris, a = paste( grep("Petal", names(iris), value=T) ))
Error in mutate_impl(.data, dots) : 
  wrong result size (2), expected 150 or 1

这不起作用。

> mutate(iris, a = paste( names(iris)[base::startsWith(names(iris),"Petal")] ))
Error in mutate_impl(.data, dots) : 
  wrong result size (2), expected 150 or 1

我的功能非常麻烦。但它的确有效。也许我使用它或搜索更简单的好的。

 > paste.colprefix <-  function(DFNAME, PREFIX){
+     TMP <- eval(parse(text= paste0("grep(\"", PREFIX, "\",names(", DFNAME, "), v=T)")))
+     TMP <- paste0(DFNAME, "$",TMP)
+     TMP <- paste0(TMP, collapse = ",")
+     eval(parse(text= paste0( "paste(", TMP, ")")))
+     }
> 
> iris$PetalPaste <- paste.colprefix("iris", "Petal")  
> head(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species PetalPaste
1            5.1         3.5          1.4         0.2     setosa    1.4 0.2
2            4.9         3.0          1.4         0.2     setosa    1.4 0.2
3            4.7         3.2          1.3         0.2     setosa    1.3 0.2
4            4.6         3.1          1.5         0.2     setosa    1.5 0.2
5            5.0         3.6          1.4         0.2     setosa    1.4 0.2
6            5.4         3.9          1.7         0.4     setosa    1.7 0.4
> 

1 个答案:

答案 0 :(得分:0)

您无法在粘贴功能中使用select帮助功能。 以下是您可以获得预期输出的技巧。
您可以过滤掉数据框的列名称,并将其用作粘贴功能的参数。 要筛选出这些列名称,您可以使用以下任何一种技术。

  • base :: startsWith(字符向量,以字符串开头)
    cn&lt; - names(iris)[base :: startsWith(names(iris),&#34; Petal&#34;)]
  • stringr :: str_detect(字符向量,要查找的正则表达式)
    cn&lt; - names(iris)[stringr :: str_detect(names(iris),&#34; Petal。*&#34;)]

在每种方法中,它将返回以&#34; Petal&#34;开头的列名称向量。

然后您可以使用以下内容来获得预期结果。

iris $ a&lt; - do.call(paste,iris [cn])