【问题标题】:Select first instance of a vector in a column选择列中向量的第一个实例
【发布时间】:2014-02-14 08:39:17
【问题描述】:

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

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

这是一个复制数据框:

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
           )

【问题讨论】:

  • 您能指定预期的输出吗?
  • lapply(lapply(as.character(testdf$string), function(x) eval(parse(text=x))), "[", c(1, 2)) 会给你例如第一个和第二个 instance 与您的示例数据。
  • 预期的输出是一个新的向量/列,列中只有向量的名字。
  • 然后是第二个,第三个...

标签: string r vector dataframe


【解决方案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

【讨论】:

  • 太棒了。感谢您提供示例!
【解决方案2】:

我想这就是你想要的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2022-08-18
    • 2011-11-07
    相关资源
    最近更新 更多