默认情况下,
paste('hi', 'there')
[1] "hi there"
如果我想要一个执行以下操作的功能怎么办?
reverse_paste('hi','there')
[1] "there hi "
有没有办法修改...
的元素以获得第二个结果?
我不知道在这种情况下如何处理...
参数,因为我想通过apply
使用函数来连接使用expand.grid
生成的数据框的元素(粘贴顺序与扩展顺序相反,这两个顺序都很重要。)
编辑:我想澄清一下,我也希望能够使用sep
和collapse
关键字参数。
答案 0 :(得分:3)
您可以使用...
获取list
中的参数。然后你只需要反转它,添加其他参数,然后调用paste
。
paste_rev <- function(..., sep=" ", collapse=NULL) {
arg <- c(rev(list(...)), list(sep=sep, collapse=collapse))
do.call(paste, arg)
}
paste_rev(c("a1", "a2"), c("b", "c"), sep=".")
## [1] "b.a1" "c.a2"
但是,如果您将apply
paste
用于数据框,那么这将不起作用,因为您实际上并未使用paste
的多个参数,而是而是发送一个矢量。
out <- expand.grid(a=c("a1", "a2"), b=c("b1", "b2"), stringsAsFactors=FALSE)
out
## a b
## 1 a1 b1
## 2 a2 b1
## 3 a1 b2
## 4 a2 b2
apply(out, 1, paste_rev, collapse=".")
## [1] "a1.b1" "a2.b1" "a1.b2" "a2.b2"
相反,我只是在粘贴之前反转列的顺序。
apply(out[rev(colnames(out))], 1, paste, collapse=".")
## [1] "b1.a1" "b1.a2" "b2.a1" "b2.a2"
或者,单独反转每个参数的元素。
paste_rev2 <- function(..., sep=" ", collapse=NULL) {
arg <- c(lapply(list(...), rev), list(sep=sep, collapse=collapse))
do.call(paste, arg)
}
apply(out, 1, paste_rev2, collapse=".")
## [1] "b1.a1" "b1.a2" "b2.a1" "b2.a2"
对于可以执行任何操作的通用函数,您可以添加几个参数。
pasteX <- function(..., sep=" ", collapse=NULL,
rev.elements=FALSE, rev.arguments=FALSE) {
arg <- list(...)
if(rev.arguments) arg <- rev(arg)
if(rev.elements) arg <- lapply(arg, rev)
do.call(paste, c(arg, list(sep=sep, collapse=collapse)))
}
pasteX(c("a", "b"), c(1, 2))
## [1] "a 1" "b 2"
pasteX(c("a", "b"), c(1, 2), rev.elements=TRUE)
## [1] "b 2" "a 1"
pasteX(c("a", "b"), c(1, 2), rev.arguments=TRUE)
## [1] "1 a" "2 b"
pasteX(c("a", "b"), c(1, 2), rev.elements=TRUE, rev.arguments=TRUE)
## [1] "2 b" "1 a"
答案 1 :(得分:-1)
尝试以下功能:
reverse_paste<-function(x){
a<-""
for(i in length(x):1)
a<-paste(a,x[i])
a
}