根据列中分隔符的数量来分隔列
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"
我有一个向量 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"