R Динамическое разделение / подмножество фрейма данных по выбранным рядам. Анализ текстовой сетки.

Я пытаюсь обработать файл сегментации.TextGrid (генерируется программой Praat). )

Исходный формат выглядит так:

File type = "ooTextFile"
Object class = "TextGrid"
xmin = 0 
xmax = 243.761375 
tiers? <exists> 
size = 17 
item []: 
    item [1]:
        class = "IntervalTier" 
        name = "phones" 
        xmin = 0 
        xmax = 243.761 
        intervals: size = 2505 
        intervals [1]:
            xmin = 0 
            xmax = 0.4274939687384032 
            text = "_" 
        intervals [2]:
            xmin = 0.4274939687384032 
            xmax = 0.472 
            text = "v" 
        intervals [3]:
[...]

(Затем это повторяется до EOF с интервалами [от 3 до n] для n Item (уровень аннотации) в файле.

Кто-топредложил решение с помощьюпакет rPython R.

К несчастью :

Я не очень хорошо знаю PythonВерсия rPython недоступна для R.3.0.2 (который я использую).Моя цель - разработать этот анализатор для моего анализа исключительно в среде R.

Сейчас моя цель состоит в том, чтобы разбить этот файл на несколько фреймов данных Каждый фрейм данных должен содержать один элемент (слой аннотации).

# Load the Data
txtgrid <- read.delim("./xxx_01_xx.textgrid", sep=c("=","\n"), dec=".", header=FALSE)
# Erase White spaces (use stringr package)
txtgrid[,1] <- str_trim(txtgrid[,1])
# Convert row.names to numeric 
num.row<- as.numeric(row.names(txtgrid))
# Redefine the original textgrid and add those rows (I want to "keep them in case for later process)
txtgrid <- data.frame(num.row,txtgrid)
colnames(txtgrid) <- c("num.row","object", "value")
head(txtgrid)

Выход изhead(txtgrid) очень сырой, так что вот первые 20 строк текстовой сеткиtxtgrid[1:20,]:

   num.row          object                value
1        1       File type           ooTextFile
2        2    Object class             TextGrid
3        3            xmin                   0 
4        4            xmax          243.761375 
5        5 tiers? <exists>                     
6        6            size                  17 
7        7        item []:                     
8        8       item [1]:                     
9        9           class        IntervalTier 
10      10            name              phones 
11      11            xmin                   0 
12      12            xmax             243.761 
13      13 intervals: size                2505 
14      14  intervals [1]:                     
15      15            xmin                   0 
16      16            xmax  0.4274939687384032 
17      17            text                   _ 
18      18  intervals [2]:                     
19      19            xmin  0.4274939687384032 
20      20            xmax               0.472 

Теперь, когда я предварительно обработал его, я могу:

# Find the number of the rows where I want to split (i.e. Item)
tier.begining <- txtgrid[grep("item", txtgrid$object, perl=TRUE), ]
# And save those numbers in a variable
x <- as.numeric(row.names(tier.begining))

Эта переменнаяx дает мне цифры-1, где мои данные должны быть разделены на несколько кадров данных.

У меня есть 18 предметов -1 (первый элемент - это пункт [], и я включаю все остальные элементы. Итак, векторx является :

     x
    [1]     7     8 10034 14624 19214 22444 25674 28904 31910 35140 38146 38156 38566 39040 39778 40222 44800
[18] 45018

Как я могу сказать R : сегментировать этот фрейм данных в несколько фреймовtextgrids$nameoftheItem таким образом, что я получаю столько данных, сколько у меня есть элементов ?, например:

textgrid$phones
         item [1]:
            class = "IntervalTier" 
            name = "phones" 
            xmin = 0 
            xmax = 243.761 
            intervals: size = 2505 
            intervals [1]:
            xmin = 0 
            xmax = 0.4274939687384032 
            text = "_" 
            intervals [2]:
            xmin = 0.4274939687384032 
            xmax = 0.472 
            text = "v" 
            [...]
            intervals [n]:
textgrid$syllable
    item [2]:
            class = "IntervalTier" 
            name = "syllable" 
            xmin = 0 
            xmax = 243.761 
            intervals: size = 1200
            intervals [1]:
            xmin = 0 
            xmax = 0.500
            text = "ve" 
            intervals [2]:
            [...]
            intervals [n]:
    textgrid$item[n]

Я хотел использовать

txtgrid.new <- split(txtgrid, f=x)

Но это сообщение верно:

Warning message: In split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...) : data length is not a multiple of split variable

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

Я также попробовал некоторыеwhich, daply (отplyr) &subset функции, но никогда не заставляли их работать должным образом!

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

Ответы на вопрос(2)

Ваш ответ на вопрос