根据列中分隔符的数量来分隔列

delimiting a column based on the number of delimiters within that column

我有一个向量 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") 

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

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

例如 return 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) 然后 return 只有第一个项目否则 return 前 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)

如果我理解这个请求,您已经在字符向量中有单独的项目,并且想要将这些元素的内部解析为由逗号分隔的尽可能多的 sub-items。扫描功能干得漂亮:

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"