#r #database #list
#r #База данных #Список
Вопрос:
Я импортирую .txt в R с
my_data<-read.delim("data",as.is=1)
Я получил фрейм данных со списком 3000.
строки выглядят следующим образом
Hello world !
C ID equipement
A
3 5 6 45
123 567 762
876 7889 986
B
bye world
Вот что я хочу сделать с этим импортированным файлом.
1/ Выберите только строки между строкой, начинающейся с «A», и строкой, начинающейся с «B». Положение этих строк может измениться, если я загружу другой .txt
2/ Выберите идентификатор оборудования из списка, который начинается с «C», и добавьте значение ко всему списку между A и B с разделителем » «
Чтобы получить список между A и B, я сделал это:
id1 <- (which(my_data=="A") 1)
id2<- (which(my_data=="B")-1)
d<- my_data[id1:id2,1]
ll <- strsplit(d," ")
ll — это вектор списка, и, например ll[1]= "3 5 6 45"
Теперь я хочу добавить оборудование ID во все эти списки.
Есть идеи, как это сделать? Кроме того, если у кого-нибудь есть идея получше для моего выбора строк между A и B, я был бы рад ее увидеть!
Спасибо
Ответ №1:
Для извлечения строк между A и B вы можете просто использовать startsWith
, например
# Your data
# This is the structure obtained using "readLines"
my_data <- c("Hello world !", "C ID equipement", "A ", "3 5 6 45", "123 567 762 ",
"876 7889 986", "B ", "bye world")
strsplit(my_data[(which(startsWith(my_data, "A")) 1L):(which(startsWith(my_data, "B")) - 1L)], " ")
# [[1]]
# [1] "3" "5" "6" "45"
#
# [[2]]
# [1] "123" "567" "762"
#
# [[3]]
# [1] "876" "7889" "986"
И для извлечения идентификатора вы можете использовать регулярное выражение, например
pat <- "^C\s (.*?)\s .*" # Expression starts with a "C", then space, then something, then space, then something
gsub(pat, "\1", grep(pat, my_data, value = TRUE))
# [1] "ID"
Наконец, для добавления идентификатора очень простой подход заключается в использовании lapply
, например
lapply(l, function(x, ID) as.numeric(x) ID, ID = 1L)
# [[1]]
# [1] 4 6 7 46
#
# [[2]]
# [1] 124 568 763
#
# [[3]]
# [1] 877 7890 987
где l
обозначает приведенный выше список и ID
установлено значение 1
для демонстрационных целей (поскольку в примере нет фактического идентификатора).