2014-02-14 47 views
0

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

我想完成的是在列中选择向量的第一,第二,第三..实例以继续。

这是一个复制数据帧:

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 
      ) 
+0

你能不能说明预期的输出? – Zbynek

+0

'lapply(lapply(as.character(testdf $ string),function(x)eval(parse(text = x))),“[”,c(1,2))''第一和第二*实例*与您的示例数据。 – lukeA

+0

期望的输出是一个新的向量/列,只有列中的向量的名字。 – spesseh

回答

0

我想这是你想要的。

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]]) 
1

这里的正则表达式的简单方法:

# 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 
+0

太棒了。感谢您提供示例! – spesseh

相关问题