2017-10-13 99 views
0

我有一些字符串列表,其中有一些字符串中有重复。例如:lapply无法遍历R中的列表

[[1]] 
    [1] "gr gal gr gal" 

    [[2]] 
    [1] "gr gal" 

    [[3]] 
    [1] "gr gal ir ol" 

    [[4]] 
    [1] "gr gal gr gal" 

    [[5]] 
    [1] "gr gal" 

我的期望的输出是:

[[1]] 
    [1] "gr gal" 

    [[2]] 
    [1] "gr gal" 

    [[3]] 
    [1] "gr gal ir ol" 

    [[4]] 
    [1] "gr gal" 

    [[5]] 
    [1] "gr gal" 

当重复被从字符串中移除。我的计划是调用strsplit(x,split =“”),然后调用拆分对象上的唯一函数。如果我这样做,选择列表中的一名成员,我的代码工作正常:

> strsplit(pathmd1[[76]], split = " ") 
    [[1]] 
    [1] "gr" "gal" "gr" "gal" 

    > splittest <- strsplit(pathmd1[[76]], split = " ") 
    > unique(unlist(splittest)) 
    [1] "gr" "gal" 

然而,当我使用lapply使用这些功能,则会引发错误

pathmd2 <- lapply(1:length(pathmd1), function(i) strsplit(pathmd1[[i]], 
       split = " ")) 
    pathmd <- lapply(1:length(pathmd2), function(i) unique(pathmd2[[i]]) 

    unexpected symbol 
    77: pathmd2 <- lapply(1:length(pathmd1), function(i) 
     strsplit(pathmd1[[i]], split = " ") 
    78: pathmd 
     ^

为什么不是功能与lapply一起工作?

+2

我觉得你越来越显示的错误,因为你在你的'strsplit'呼叫在该例子到底忘了“)”进行迭代像 –

+0

缺少尾随括号在'pathmd < - ...'命令的末尾,而不是'strsplit'命令。 – r2evans

+0

即使传递单个字符串,strsplit也会提供一个列表输出。考虑将你的列表重新写入一个字符向量中。 strsplit的输出将采用预期的格式。然后这个电话就是:'lapply(strsplit(charVec,''),unique)'。 – AdamO

回答

0

你可以试试:

lapply(f, function(x) unique(unlist(strsplit(x, " ")))) 
#output 
[[1]] 
[1] "gr" "gal" 

[[2]] 
[1] "gr" "gal" 

[[3]] 
[1] "gr" "gal" "ir" "ol" 

[[4]] 
[1] "gr" "gal" 

[[5]] 
[1] "gr" "gal" 

其中f是您的清单。

有没有需要用for