Р: Как мне преобразовать фрейм данных в матрицу смежности, если значения удовлетворяют определенному условию? - PullRequest
0 голосов
/ 28 января 2020

У меня есть набор данных, который я хотел бы запросить и преобразовать в матрицу смежности, используя R.

Пример набора данных будет следующим:

> track_df
     track  sound start   end
1  track1A    car  1000  2000
2  track1A person  1200  1500
3  track1A    car  1500  1700
4  track1A    dog  2300  3000
5  track1B    cat  5000  8000
6  track1B    car  5500  8500
7  track1B    car  7500 10000
8  track1B person  8000  9000
9  track1C    dog  1300  1600
10 track1C    car  1500  1800
11 track1C person  1700  2000

В примере показаны звуки записанный на дорожке с началом и концом каждого звука. Треки содержат несколько звуков.

Код для создания примера:

> track <- c('track1A', 'track1A', 'track1A', 'track1A', 'track1B', 'track1B', 'track1B', 'track1B', 'track1C', 'track1C', 'track1C')
> sound <- c('car', 'person', 'car', 'dog', 'cat', 'car', 'car', 'person', 'dog', 'car', 'person')
> start <- c(1000, 1200, 1500, 2300, 5000, 5500, 7500, 8000, 1300, 1500, 17000)
> end <- c(2000, 1500, 1700, 3000, 8000, 8500, 10000, 8000, 1300, 1500, 1700)
> end <- c(2000, 1500, 1700, 3000, 8000, 8500, 10000, 900, 1600, 1800, 2000)
> track_df <- data.frame(track, sound, start, end)

Используя набор данных, приведенный выше, мне нужно найти количество пересечений / пересечений двух звуков (в зависимости от их начала). и время окончания).

Если звук начинается или заканчивается во время другого звука в дорожке, он считается перекрывающимся.

Требуемый выходной сигнал будет примерно таким, который я могу превратить в тепловая карта или сеть.

> matrix
       car person dog cat
car      2      4   1   2
person   4      0   0   0
dog      1      0   0   0
cat      2      0   0   0

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

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

Любая помощь будет принята с благодарностью .

1 Ответ

0 голосов
/ 30 января 2020

У меня есть только не векторизованное решение, которое, по сути, действительно перебирает каждую комбинацию звуков в дорожке .

track <- c('track1A', 'track1A', 'track1A', 'track1A', 'track1B', 'track1B', 'track1B', 'track1B', 'track1C', 'track1C', 'track1C')
sound <- c('car', 'person', 'car', 'dog', 'cat', 'car', 'car', 'person', 'dog', 'car', 'person')
start <- c(1000, 1200, 1500, 2300, 5000, 5500, 7500, 8000, 1300, 1500, 1700)
end <- c(2000, 1500, 1700, 3000, 8000, 8500, 10000, 9000, 1600, 1800, 2000)
track_df <- data.frame(track, sound, start, end)
names = levels(track_df$sound)
m = matrix(0, length(names), length(names), F, list(names, names))
for (track in split(track_df, track_df$track))
{
    n = nrow(track)
    for (i in 1:(n-1)) for (j in (i+1):n)
        if (track[i,]$start < track[j,]$end)
        if (track[j,]$start < track[i,]$end)
            m[track[j,]$sound, track[i,]$sound] =
            m[track[i,]$sound, track[j,]$sound] =
            m[track[i,]$sound, track[j,]$sound] + 1
}
print(m)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...