我有一个向量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")
非常感谢有关如何更正此代码的任何见解。
答案 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"