1) Предполагая, что x определено воспроизводимо в примечании, в конце используйте read.table
, как показано.Регулярные выражения или пакеты не используются.
read.table(text = Table$Column, sep = "|", header = FALSE,
as.is = TRUE, fill = TRUE)[6]
, что дает:
V6
1 Gold
2 Silver
3 Silver
4 Iron
5 Copper
6 Iron
2) В этой альтернативе используется регулярное выражение (которое вопрос не задавался)) но на всякий случай вот решение по тидиру.Обратите внимание, что для этого требуется tidyr 0.8.2 или более поздней версии, поскольку более ранние версии tidyr не поддерживали NA
в аргументе into=
.
library(dplyr)
library(tidyr)
Table %>%
separate(Column, into = c(rep(NA, 5), "commodity"), sep = "\\|", extra = "drop")
, что дает:
commodity
1 Gold
2 Silver
3 Silver
4 Iron
5 Copper
6 Iron
3) Это еще одно базовое решение.Вероятно, это не тот, который вы хотите, учитывая, что (1) намного проще, но я хотел посмотреть, сможем ли мы придумать второй подход в базе, который не использует регулярные выражения.Обратите внимание, что если split=
аргумент strsplit
равен ""
, то он обрабатывается специально и не является регулярным выражением.Он создает список, каждый из компонентов которого представляет собой вектор из отдельных символов.Каждый такой вектор передается анонимной функции, которая помечает |
и символы в поле после него своим порядковым номером.Затем мы берем символы, соответствующие 5 (кроме первого, как |
) и сворачиваем их вместе, используя paste
.
data.frame(commodities = sapply(strsplit(Table$Column, ""), function(chars) {
wx <- which(cumsum(chars == "|") == 5)
paste(chars[seq(wx[2], tail(wx, 1))], collapse = "")
}), stringsAsFactors = FALSE)
, давая:
commodities
1 Gold
2 Silver
3 Silver
4 Iron
5 Copper
6 Iron
Примечание
Table <- data.frame(Column = c("|1||KK|12|Gold||4K|",
"|1||Rst|E|Silver||13||",
"|1||RST|E|Silver||18||",
"|1||KK|Y|Iron|y|12||",
"|1||||Copper|Cpr|||E",
"|1||||Iron|||12|F"), stringsAsFactors = FALSE)