【问题标题】:R strsplit, nested lists bluesR strsplit,嵌套列表蓝调
【发布时间】:2016-02-05 20:16:33
【问题描述】:

我在 R 中遇到了这个问题,我想用逗号分割字符串,然后用分号进一步分割,但只保留分号之前的第一项,即下面的 ee 和 jj。我尝试了很多东西,但嵌套列表似乎太复杂了!

这是我正在做的事情:

d <- c("aa,bb,cc,dd,ee;e,ff",
       "gg,hh,ii,jj;j")

e=strsplit(d,",")
myfun2 <- function(x,arg1) {
 strsplit(x,";")
}
f=lapply(e,myfun2)
f=
 [[1]]
 [[1]][[1]]
 [1] "aa"

 [[1]][[2]]
 [1] "bb"

 [[1]][[3]]
 [1] "cc"

 [[1]][[4]]
 [1] "dd"

 [[1]][[5]]
 [1] "ee" "e" 

 [[1]][[6]]
 [1] "ff"

 [[2]]
 [[2]][[1]]
 [1] "gg"

 [[2]][[2]]
 [1] "hh"

 [[2]][[3]]
 [1] "ii"

 [[2]][[4]]
 [1] "jj" "j" 

这是我想要的输出

Correct output=
[[1]]
[1] "aa" "bb" "cc" "dd" "ee" "ff"

[[2]]
[1] "gg" "hh" "ii" "jj"

我已经尝试了很多事情,使用 lapply 到嵌套列表“f”并使用了“[[”和“[”但没有成功。

非常感谢任何帮助。 (我知道我错过了一些愚蠢的东西,但现在无法弄清楚!)

【问题讨论】:

    标签: r string list nested-lists strsplit


    【解决方案1】:

    这是你的代码

    d <- c("aa,bb,cc,dd,ee;e,ff", "gg,hh,ii,jj;j")
    e <- strsplit(d,",")
    myfun2 <- function(x,arg1) { strsplit(x,";") }
    f <- lapply(e,myfun2)
    

    如果我们从你的f开始,那么下一步就是

    lapply(f,function(x) mapply(`[`,x,1))
    
    [[1]] [1] “aa” “bb” “cc” “dd” “ee” “ff” [[2]] [1] “gg” “hh” “ii” “jj”

    基本上,您需要一个内部类型和外部类型的应用函数来向下两个嵌套级别。

    【讨论】:

    • 完美!这正是我想要的。没用过mapply!
    【解决方案2】:

    我们可以使用gsub匹配模式;后跟一个或多个字母字符,替换为'',然后将(strsplit)拆分为,

    strsplit(gsub(';[a-z]+', '', d), ',')
    #[[1]]
    #[1] "aa" "bb" "cc" "dd" "ee" "ff"
    
    #[[2]]
    #[1] "gg" "hh" "ii" "jj"
    

    【讨论】:

    • 谢谢!是的,我试过 gsub。上面的例子是一个程式化的例子。实际上,我可以有“aa__;bb__;zz__”等字符串,其中一些甚至不必是字母,也可以是数字。因此,要匹配的正则表达式模式可能非常复杂。
    • 好的。我道歉。我想我会找出任务的相关正则表达式并接受你的回答。谢谢!
    • @BladeRunner 没关系。如果您可以在帖子中显示一些示例并进行更新,我会尽力回答。
    • 下面的解决方案更好,不依赖于显式的正则表达式匹配。
    • @BladeRunner 好的,没问题。
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多