Значения подмножества R, включая вертикальную черту (|) - PullRequest
2 голосов
/ 05 июня 2019

Я пытаюсь разместить данные на основе значения столбца.Я пытаюсь установить подмножество, если этот конкретный столбец имеет только один уровень информации.Вот как выглядят мои данные.

data <- cbind(v1=c("a", "ab", "a|12|bc", "a|b", "ac","bc|2","b|bc|12"),
            v2=c(1,2,3,5,3,1,2))

> data
     v1        v2 
[1,] "a"       "1"
[2,] "ab"      "2"
[3,] "a|12|bc" "3"
[4,] "a|b"     "5"
[5,] "ac"      "3"
[6,] "bc|2"    "1"
[7,] "b|bc|12" "2"

Я хочу использовать только те значения символов, которые не включают "|", как показано ниже:

> data
     v1        v2 
[1,] "a"       "1"
[2,] "ab"      "2"
[3,] "ac"      "3"

в основном, я пытаюсьизбавиться от двухуровневых (x | y) или трехуровневых значений (x | y | z).Есть мысли по этому поводу?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 05 июня 2019

Мы можем использовать grep, чтобы найти строку, которая имеет |, использовать опцию invert, чтобы получить индекс строки элементов, которые не имеют |, использовать это для подмножества строк matrix

data[grep("|", data[,1], invert = TRUE, fixed = TRUE), ]
#   v1   v2 
#[1,] "a"  "1"
#[2,] "ab" "2"
#[3,] "ac" "3"

ПРИМЕЧАНИЕ. Используется fixed = TRUE, иначе он будет проверять при включенном режиме регулярных выражений, а | является метасимволом для условия OR. Другой вариант - экранировать (\\|) или поместить его в квадратные скобки ([|]), чтобы захватить буквальный символ (когда fixed = FALSE)

3 голосов
/ 05 июня 2019

Используя логический grepl, это можно сделать следующим образом.Я оставлю это в двух строках кода для ясности, но это просто сделать из него однострочным.

i <- !grepl("\\|", data[, 1])
data[i, ]
#     v1   v2 
#[1,] "a"  "1"
#[2,] "ab" "2"
#[3,] "ac" "3"
...