【问题标题】:delimiting a column based on the number of delimiters within that column根据列中分隔符的数量来分隔列
【发布时间】:2018-03-28 22:12:11
【问题描述】:

我有一个向量 list.exp2,其中每个条目是一个或多个用逗号分隔的字符串。我想拆分每个条目并根据该条目中存在的分隔符数量获取前 n 个字符串。

我已经尝试了下面的代码,但还没有成功

refined.final.list <- as.vector(sapply(list.exp2, function(n)
         ifelse(count.fields(textConnection(list.exp2[n]), sep = ",") < 3,
                unlist(strsplit(list.exp2[n], ","))[1],
                count.fields(textConnection(list.exp2[n]), sep = ",") < 5, 
                unlist(strsplit(list.exp2[n], ","))[1:2],
                unlist(strsplit(list.exp2[n], ","))[1:4])))

基本上,我使用 ifelse 和 count 函数来计算分隔符的数量,而 unlist 函数应该给我相应的拆分元素。

list.exp2 向量如下所示

lis.exp2 <- c("ISTITUTO PER LA SINTESI ORGANICA E LA FOTOREATTIVITÀ (ISOF-CNR), 
               SEZIONE DI FERRARA, VIA L. BORSARI 46, 44100 FERRARA, ITALY",
              "FLUXOME SCIENCES A/S, SØLTOFTS PLADS, BUILDING 223, DK-2800 KGS. LYNGBY, DENMARK",
              "FERDINAND-BRAUN-INSTITUT FÜR HÖCHSTFREQUENZTECHNIK, GUSTAV-KIRCHHOFF-STR. 4, 12489 BERLIN, GERMANY") 

我们将不胜感激任何有关如何更正此代码的见解。

【问题讨论】:

  • ifelse(test, truevalue, falsevalue) 应该只有三个参数,而不是五个。如果您有多个条件,则需要嵌套它们 - 例如ifelse(test, truevalue, ifelse(test2, truevalue2, falsevalue))
  • 我实际上也在做同样的事情。它只是看起来像五个论点。我有另一组代码具有更好的 ifelse 显示结构。

标签: r delimiter strsplit


【解决方案1】:

如果我理解这个请求,您已经在字符向量中有单独的项目,并且希望将这些元素的内部解析为用逗号分隔的尽可能多的子项目。扫描功能做得很好:

sapply(lis.exp2, function(x) {scan( text=x,what="", sep=",")})
Read 5 items
Read 5 items
Read 4 items
$`ISTITUTO PER LA SINTESI ORGANICA E LA FOTOREATTIVITÀ (ISOF-CNR), SEZIONE DI FERRARA, VIA L. BORSARI 46, 44100 FERRARA, ITALY`
[1] "ISTITUTO PER LA SINTESI ORGANICA E LA FOTOREATTIVITÀ (ISOF-CNR)"
[2] " SEZIONE DI FERRARA"                                            
[3] " VIA L. BORSARI 46"                                             
[4] " 44100 FERRARA"                                                 
[5] " ITALY"                                                         

$`FLUXOME SCIENCES A/S, SØLTOFTS PLADS, BUILDING 223, DK-2800 KGS. LYNGBY, DENMARK`
[1] "FLUXOME SCIENCES A/S" " SØLTOFTS PLADS"      " BUILDING 223"       
[4] " DK-2800 KGS. LYNGBY" " DENMARK"            

$`FERDINAND-BRAUN-INSTITUT FÜR HÖCHSTFREQUENZTECHNIK, GUSTAV-KIRCHHOFF-STR. 4, 12489 BERLIN, GERMANY`
[1] "FERDINAND-BRAUN-INSTITUT FÜR HÖCHSTFREQUENZTECHNIK"
[2] " GUSTAV-KIRCHHOFF-STR. 4"                          
[3] " 12489 BERLIN"                                     
[4] " GERMANY"            

【讨论】:

    【解决方案2】:

    一种选择是直接在您的矢量lis.exp2 上使用strsplit。它将生成一个列表,其中向量中的每个项目都有一个项目。然后使用lapply 返回所需的元素数量。

    返回 3 个项目的示例:

    n <- 3
    lapply(strsplit(lis.exp2, split=","), function(x)x[1:n])
    
    #OR Based on @thelatemail suggestion
    
    lapply(strsplit(lis.exp2, split=","), head, n)
    
    #Result
    # [[1]]
    # [1] "ISTITUTO PER LA SINTESI ORGANICA E LA FOTOREATTIVITÀ (ISOF-CNR)"
    # [2] " SEZIONE DI FERRARA"                                            
    # [3] " VIA L. BORSARI 46"                                             
    # 
    # [[2]]
    # [1] "FLUXOME SCIENCES A/S" " SØLTOFTS PLADS"      " BUILDING 223"       
    # 
    # [[3]]
    # [1] "FERDINAND-BRAUN-INSTITUT FÜR HÖCHSTFREQUENZTECHNIK"
    # [2] " GUSTAV-KIRCHHOFF-STR. 4"                          
    # [3] " 12489 BERLIN"    
    

    **更新:**基于 OP 的反馈 可以编写一个函数来检查项目数是否小于 (say 4) 然后只返回第一个项目,否则返回前 3 个项目。

    #Function to return top 1/3 items based on condition
    getNItems <- function(x){
      if(length(x) <= 4){
        #only 1st
        x[1]
      }else{
        #first 3
        x[1:3]
      }
    }                                 
    lapply(strsplit(lis.exp2, split=","), getNItems)
    

    【讨论】:

    • 您也可以使用lapply(strsplit(lis.exp2, split=","), head, n),这可能不那么深奥。
    • 这段代码似乎很有用。但是,我想要根据该元素中字符串的数量来改变 n 值(或头部)。因此,我的挑战/问题是将此代码包含在一个函数中,该函数遍历向量的每个元素,如果该元素中的字符串数量很少,那么我只想要该元素的第一个字符串。因此,如果有很多,那么我想要该元素的前三个字符串。
    • @JGG 修改后的答案。希望这能解决您的问题。
    • 确实如此。谢谢。
    • @JGG 很高兴知道它对您有用。您可以通过单击我的答案左侧的tick 标记来接受答案。这将对未来的用户有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多