R манипулирование набором данных из .txt

#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 для демонстрационных целей (поскольку в примере нет фактического идентификатора).