根据该列中的分隔符数分隔列

时间:2018-03-28 22:12:12

标签: r delimiter strsplit

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

非常感谢有关如何更正此代码的任何见解。

2 个答案:

答案 0 :(得分:1)

一种选择可能是直接在您的向量strsplit上使用lis.exp2。它将生成一个列表,其中包含来自向量的每个项目的一个项目。然后使用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)

答案 1 :(得分: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"