Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接R中字符串列表的正确方法_R_String - Fatal编程技术网

连接R中字符串列表的正确方法

连接R中字符串列表的正确方法,r,string,R,String,在R中执行以下字符串连接的惯用方法是什么 给定两个字符串向量,例如: titles <- c("A", "B") sub.titles <- c("x", "y", "z") R是否允许类似程度的表达 备注 迄今为止提出的解决方案中的共识是,在R中实现这一点的惯用方法基本上是 full.titles <- c(t(outer(titles, sub.titles, paste, sep = "_"))) 其中,product是来自itertools模块的笛卡尔乘积函数。然而

在R中执行以下字符串连接的惯用方法是什么

给定两个字符串向量,例如:

titles <- c("A", "B")
sub.titles <- c("x", "y", "z")
R是否允许类似程度的表达

备注

迄今为止提出的解决方案中的共识是,在R中实现这一点的惯用方法基本上是

full.titles <- c(t(outer(titles, sub.titles, paste, sep = "_")))

其中,
product
是来自itertools模块的笛卡尔乘积函数。然而,在Python中,
map
的这种用法被认为比上面的列表理解的等效用法更复杂,也就是说,表达能力较差。

使用
do.call
paste
expand.grid

sort(do.call(paste, c(sep='_', expand.grid(titles, sub.titles))))
#[1] "A_x" "A_y" "A_z" "B_x" "B_y" "B_z"
unite(expand.grid(titles, sub.titles), Res, everything()) %>% .$Res
或者使用
tidyr::unite
expand.grid

sort(do.call(paste, c(sep='_', expand.grid(titles, sub.titles))))
#[1] "A_x" "A_y" "A_z" "B_x" "B_y" "B_z"
unite(expand.grid(titles, sub.titles), Res, everything()) %>% .$Res
请尝试以下代码:

unlist(lappy(1:length(titles),function(x){paste(titles[x],sub.titles,sep=“”)}))

expand.grid
标题
子标题
之间创建一个组合矩阵

apply
向下移动组合矩阵并将它们粘贴在一起。

有几种方法可以实现这一点,可以使用'outer()'函数将函数定义为两个向量的矩阵积,如下所示:

outer(标题、子标题、粘贴、sep=''”

然后使用
expand.grid()


do.call(粘贴,扩展.grid(titles,sub.titles,sep='',stringsAsFactors=FALSE))
此代码也可以:
as.vector(外部(titles,subtitles,FUN=paste,sep=“”)

outer
基本上对每个向量中的每个元素执行一个功能元素。因此,它将从
标题
中获取每个元素,并使用
副标题
中的每个元素执行一个函数。默认函数是乘法,但我们通过将新参数传递给
FUN
参数来更改默认值。新函数中使用的参数附加在逗号之后。因此,我们告诉R从
标题
中选取第一个元素,并将其与
副标题
中的每个元素粘贴在一起,并用“\ux”分隔这两个元素。然后使用
titles

full.titles full.titles中的第二个元素再次执行此操作
full.titles  <-  paste0(expand.grid(titles,sub.titles)$Var1,'_',
expand.grid(titles,sub.titles)$Var2)
>full.titles
[1] "A_x" "B_x" "A_y" "B_y" "A_z" "B_z"
[1] “A_x”“B_x”“A_y”“B_y”“A_z”“B_z”
@brittenb没有按照问题中的要求生成向量。@zacdav是的,我现在正在查看输出,不明白为什么它没有生成预期的输出。我将删除注释。有点直接的翻译:mapply(函数(x,y)sprintf(“%s_%s”,x,y),rep(titles,each=length(subtitles)),subtitles)R在这个例子中比Python更“丰富多彩”…想知道每个人都能想到多少不同的方式…当然它是基本的R;)但我喜欢用咖喱。另外,使用
tidyr
寻找一个优雅的单行程序,但是
unite(expand.grid(titles,sub.titles),everything())
似乎不起作用。既然你解决了我的问题,你可以将它作为答案发布。你可能可以将它包装到
c
中,就像
c(outer(titles,sub.titles,paste,sep='')
优雅一样。这几乎产生了正确的输出。不幸的是,生成的组件顺序错误。(我更新了这个问题来澄清这一点。)转置修复了这个问题:
c(t(外部(…))
apply(expand.grid(titles, sub.titles), 1, paste, collapse = "_")
full.titles  <-  paste0(expand.grid(titles,sub.titles)$Var1,'_',
expand.grid(titles,sub.titles)$Var2)
>full.titles
[1] "A_x" "B_x" "A_y" "B_y" "A_z" "B_z"