String 选择列中向量的第一个实例

String 选择列中向量的第一个实例,string,r,vector,dataframe,String,R,Vector,Dataframe,我有一个匹配函数的输出。在某些情况下,函数无法从匹配的两个或多个名称中选择一个,因此将它们都/全部存储在列中的向量中 我要做的是选择第一个、第二个、第三个。。要继续的列中向量的实例 这是一个复制数据帧: string <- c("c(\"Kaskazini 'A'\", \"Kaskazini 'B'\")","c(\"Kabale\", \"Kabare\")","c(\"Kisoko\", \"Kisoro Tc\")", "c(\"Luwero East\",

我有一个匹配函数的输出。在某些情况下,函数无法从匹配的两个或多个名称中选择一个,因此将它们都/全部存储在列中的向量中

我要做的是选择第一个、第二个、第三个。。要继续的列中向量的实例

这是一个复制数据帧:

string <- c("c(\"Kaskazini 'A'\", \"Kaskazini 'B'\")","c(\"Kabale\", \"Kabare\")","c(\"Kisoko\", \"Kisoro Tc\")",
            "c(\"Luwero East\", \"Luwero West\")", "c(\"Marindi\", \"Malindi\")",c("c(\"Mukongoro\", \"Mukono Tc\", \"Muko\")")
)

testdf <- data.frame(string
           )

我想这就是你想要的

string <- c("c(\"Kaskazini 'A'\", \"Kaskazini 'B'\")","c(\"Kabale\", \"Kabare\")","c(\"Kisoko\", \"Kisoro Tc\")",
            "c(\"Luwero East\", \"Luwero West\")", "c(\"Marindi\", \"Malindi\")",c("c(\"Mukongoro\", \"Mukono Tc\", \"Muko\")")
)

testdf <- data.frame(string)
#convert all quotes into pipe symbol for use as a delimiter
testdf$string <- gsub('"',"|",testdf$string)
#split the string using pipe
testdf$strsplit <- strsplit(testdf$string, "|",fixed=TRUE)
#extract first name using sapply
testdf$first <- sapply(testdf$strsplit, function(x) x[[2]])
#extract second name using sapply
testdf$second <- sapply(testdf$strsplit, function(x) x[[4]])

下面是使用正则表达式的一种简单方法:

# extract instances (in a list)
strings <- regmatches(testdf$string, 
                      gregexpr("(?<=\")[^\"]+?(?=\"[,)])", 
                               testdf$string, perl = TRUE))

[[1]]
[1] "Kaskazini 'A'" "Kaskazini 'B'"
[[2]]
[1] "Kabale" "Kabare"
[[3]]
[1] "Kisoko"    "Kisoro Tc"
[[4]]
[1] "Luwero East" "Luwero West"
[[5]]
[1] "Marindi" "Malindi"
[[6]]
[1] "Mukongoro" "Mukono Tc" "Muko"     


# add columns to `testdf`
testdf$first <- sapply(strings, "[", 1)
testdf$second <- sapply(strings, "[", 2)
testdf$third <- sapply(strings, "[", 3)

                               string         first        second third
1 c("Kaskazini 'A'", "Kaskazini 'B'") Kaskazini 'A' Kaskazini 'B'  <NA>
2               c("Kabale", "Kabare")        Kabale        Kabare  <NA>
3            c("Kisoko", "Kisoro Tc")        Kisoko     Kisoro Tc  <NA>
4     c("Luwero East", "Luwero West")   Luwero East   Luwero West  <NA>
5             c("Marindi", "Malindi")       Marindi       Malindi  <NA>
6 c("Mukongoro", "Mukono Tc", "Muko")     Mukongoro     Mukono Tc  Muko
如果不想手动创建所有列或不知道实例的最大数量,可以使用以下方法:

res <- sapply(seq(max(sapply(strings, length))), function(x) 
  sapply(strings, "[", x))

cbind(testdf, res)

                               string             1             2    3
1 c("Kaskazini 'A'", "Kaskazini 'B'") Kaskazini 'A' Kaskazini 'B' <NA>
2               c("Kabale", "Kabare")        Kabale        Kabare <NA>
3            c("Kisoko", "Kisoro Tc")        Kisoko     Kisoro Tc <NA>
4     c("Luwero East", "Luwero West")   Luwero East   Luwero West <NA>
5             c("Marindi", "Malindi")       Marindi       Malindi <NA>
6 c("Mukongoro", "Mukono Tc", "Muko")     Mukongoro     Mukono Tc Muko

请指定预期的输出,好吗?LapplyApplyas.charactertestdf$string,functionx evalparsetext=x,[,c1,2将为您提供示例数据,例如第1个和第2个实例。预期的输出是一个新的向量/列,其中只包含列中向量的第一个名称。然后是第二个、第三个…很好。感谢您提供示例!