操纵字符串R以产生特定的输出

操纵字符串R以产生特定的输出,r,string,R,String,我有这样的字符向量 sol=c("119","911","*","ab","ba","*","*","abcd","bcda","abcd","cdab","abcd","dabc","*","*","*","*") 我想一次取一个向量,并产生如下输出 做同样的事情最快的方法是什么?基本上,我想在任何地方开一条新的生产线*。如果有连续的*则我只需要一个新行。连续的非*元素应打印在新行上,如果是连续的非*元素,如果有任何重复元素,则不应打印 119 911 ab ba abcd bcda cda

我有这样的字符向量

sol=c("119","911","*","ab","ba","*","*","abcd","bcda","abcd","cdab","abcd","dabc","*","*","*","*")
我想一次取一个向量,并产生如下输出

做同样的事情最快的方法是什么?基本上,我想在任何地方开一条新的生产线*。如果有连续的*则我只需要一个新行。连续的非*元素应打印在新行上,如果是连续的非*元素,如果有任何重复元素,则不应打印

119 911
ab ba
abcd bcda cdab dabc

我正在考虑写一个for循环并打印元素,直到遇到一个*。但不确定如何确保如何处理连续*以生成一个新行,也不确定如何从非*元素的连续列表中删除重复元素,您可以尝试以下方法

> print(gsub("(?:\\s*\\*)+\\s*", "\\\n", paste(sol, collapse=" ")))
[1] "119 911\nab ba\nabcd bcda abcd cdab abcd dabc\n"

你可以试试下面的

> print(gsub("(?:\\s*\\*)+\\s*", "\\\n", paste(sol, collapse=" ")))
[1] "119 911\nab ba\nabcd bcda abcd cdab abcd dabc\n"

你可以试试下面的

> print(gsub("(?:\\s*\\*)+\\s*", "\\\n", paste(sol, collapse=" ")))
[1] "119 911\nab ba\nabcd bcda abcd cdab abcd dabc\n"

你可以试试下面的

> print(gsub("(?:\\s*\\*)+\\s*", "\\\n", paste(sol, collapse=" ")))
[1] "119 911\nab ba\nabcd bcda abcd cdab abcd dabc\n"

下面是一个尝试,基于
cumsum
-对匹配的案例进行分类
*

lapply(split(sol[sol!="*"],cumsum(sol=="*")[sol!="*"]),unique)
#$`0`
#[1] "119" "911"
# 
#$`1`
#[1] "ab" "ba"
#
#$`3`
#[1] "abcd" "bcda" "cdab" "dabc"

然后,您可以使用以下命令将其写入文本文件:

下面是一个尝试,它基于
cumsum
-将符合
*
的案例进行比较:

lapply(split(sol[sol!="*"],cumsum(sol=="*")[sol!="*"]),unique)
#$`0`
#[1] "119" "911"
# 
#$`1`
#[1] "ab" "ba"
#
#$`3`
#[1] "abcd" "bcda" "cdab" "dabc"

然后,您可以使用以下命令将其写入文本文件:

下面是一个尝试,它基于
cumsum
-将符合
*
的案例进行比较:

lapply(split(sol[sol!="*"],cumsum(sol=="*")[sol!="*"]),unique)
#$`0`
#[1] "119" "911"
# 
#$`1`
#[1] "ab" "ba"
#
#$`3`
#[1] "abcd" "bcda" "cdab" "dabc"

然后,您可以使用以下命令将其写入文本文件:

下面是一个尝试,它基于
cumsum
-将符合
*
的案例进行比较:

lapply(split(sol[sol!="*"],cumsum(sol=="*")[sol!="*"]),unique)
#$`0`
#[1] "119" "911"
# 
#$`1`
#[1] "ab" "ba"
#
#$`3`
#[1] "abcd" "bcda" "cdab" "dabc"


然后,您可以使用以下命令将其写入文本文件:

Itisclose。但是我怎样才能得到一条新的线路而不是\n?如我在问题中的输出所示,我希望每组文本都在一行上。还有,我怎样才能从“abcd bcda abcd cdab abcd dabc”中去掉第二个和第三个abcd?@user2543622-
\n
是一个新行。它很接近。但是我怎样才能得到一条新的线路而不是\n?如我在问题中的输出所示,我希望每组文本都在一行上。还有,我怎样才能从“abcd bcda abcd cdab abcd dabc”中去掉第二个和第三个abcd?@user2543622-
\n
是一个新行。它很接近。但是我怎样才能得到一条新的线路而不是\n?如我在问题中的输出所示,我希望每组文本都在一行上。还有,我怎样才能从“abcd bcda abcd cdab abcd dabc”中去掉第二个和第三个abcd?@user2543622-
\n
是一个新行。它很接近。但是我怎样才能得到一条新的线路而不是\n?如我在问题中的输出所示,我希望每组文本都在一行上。还有,我怎样才能从“abcd bcda abcd cdab abcd dabc”中去掉第二个和第三个abcd?@user2543622-
\n
是一个新行。谢谢。我在你提供的链接中添加了一行writeLines(unlist(lappy(mylist,paste,collapse=“”)),我得到了我想要的东西。能否解释一下上面这行是如何工作的?我理解重叠和分割部分。我对
cumsum(sol==“*””[sol!=“*”]
part感到困惑。我知道
(sol==“*”)
根据sol中字符*的存在返回真、假列表,
sol=“*”]
的作用正好相反,累积和是累积和函数。但我搞不懂这些东西在一起时是如何工作的。它们的解决顺序是什么?@user2543622-当你对向量匹配*求和时,你会得到一个计数器,每次*被击中时,计数器都会增加1。这意味着在每个非*组中,都有一个不同的常量计数器值。由于split操作的是删除*值的向量,因此实际组变量也需要进行相同的选择。因此,cumsum部分的子集。尝试将代码分解并运行每个部分,看看它是如何工作的。
cumsum(sol==“*”)
返回
[1]0 1 1 1 2 3 3 3 3 4 5 6 7 8 9 10 11
。而
解决方案=“*”
返回
[1]TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
cumsum(sol==“*””[sol!=“*”]
做什么以及如何做?执行顺序是什么?@user2543622-执行顺序首先是
cumsum
计数器,它将对以
*
字符为边界的组放置一个唯一的计数器。然后,这是使用
[sol!=“*”]
仅保留非
*
字符串的子集。比较
cbind(sol,cumsum(sol=“*”)
cbind(sol[sol!=“*”],cumsum(sol=“*””)[sol!=“*”])
以了解这对于
拆分的正确工作是多么必要。这里有另一个问题,我解释了几乎完全相同的问题:谢谢。我在你提供的链接中添加了一行writeLines(unlist(lappy(mylist,paste,collapse=“”)),我得到了我想要的东西。能否解释一下上面这行是如何工作的?我理解重叠和分割部分。我对
cumsum(sol==“*””[sol!=“*”]
part感到困惑。我知道
(sol==“*”)
根据sol中字符*的存在返回真、假列表,
sol=“*”]
的作用正好相反,累积和是累积和函数。但我搞不懂这些东西在一起时是如何工作的。它们的解决顺序是什么?@user2543622-当你对向量匹配*求和时,你会得到一个计数器,每次*被击中时,计数器都会增加1。这意味着在每个非*组中,都有一个不同的常量计数器值。由于split操作的是删除*值的向量,因此实际组变量也需要进行相同的选择。因此,cumsum部分的子集。尝试将代码分解并运行每个部分,看看它是如何工作的。
cumsum(sol==“*”)
返回
[1]0 1 1 1 2 3 3 3 3 4 5 6 7 8 9 10 11
。而
解决方案=“*”
返回
[1]TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
cumsum(sol==“*””[sol!=“*”]
做什么以及如何做?什么