#r #dataframe #formatting #networkx #igraph
#r #фрейм данных #форматирование #networkx #igraph
Вопрос:
У меня есть фрейм данных с двумя столбцами: первый-это имя американских политиков ( bioname
). Вторая колонка-это их идеологический балл D-W ( dw1
). Я хочу создать сеть, в которой bioname
узлы/вершины являются узлами, а ребра/связи взвешиваются как разница между dw1
оценками двух политиков. Например, я бы хотел, чтобы вес ребра между Трампом и Байденом составлял .3615 (.7015 — .34) и .022 (.7015 — .6795) между Трампом и Роджерсом и так далее для КАЖДОЙ ВОЗМОЖНОЙ ПАРЫ предметов в наборе данных.
Как я могу переформатировать свои данные, чтобы вычислить эти различия для всех политиков в наборе данных?
бионаме | дв1 |
---|---|
Козырь | 0.7015 |
Байден | 0.3400 |
Роджерс | 0.6795 |
Сьюэлл | 0.3035 |
Ручьи | 0.8255 |
Комментарии:
1. Пожалуйста, поделитесь своими образцами данных в виде текста, а не изображения.
2. @GregorThomas, я обновил его до текста. Теперь это выглядит правильно?
3. Я могу скопировать/вставить его, спасибо!
Ответ №1:
dist
должно также работать
out lt;- with(df, as.matrix(dist(setNames(dw1, bioname))))
-выход
gt; out Trump Biden Rogers Sewell Brooks Trump 0.0000 0.3615 0.0220 0.3980 0.1240 Biden 0.3615 0.0000 0.3395 0.0365 0.4855 Rogers 0.0220 0.3395 0.0000 0.3760 0.1460 Sewell 0.3980 0.0365 0.3760 0.0000 0.5220 Brooks 0.1240 0.4855 0.1460 0.5220 0.0000
Ответ №2:
Я бы создал именованный вектор и использовал outer
его для построения матрицы различий. Вызов вашего фрейма данных df
:
named_vec = setNames(df$dw1, nm = df$bioname) outer(named_vec, named_vec, FUN = "-") # Trump Biden Rogers Sewell Brooks # Trump 0.0000 0.3615 0.0220 0.3980 -0.1240 # Biden -0.3615 0.0000 -0.3395 0.0365 -0.4855 # Rogers -0.0220 0.3395 0.0000 0.3760 -0.1460 # Sewell -0.3980 -0.0365 -0.3760 0.0000 -0.5220 # Brooks 0.1240 0.4855 0.1460 0.5220 0.0000
Использование этих данных
df = read.table(text = 'bioname dw1 Trump 0.7015 Biden 0.3400 Rogers 0.6795 Sewell 0.3035 Brooks 0.8255', header = T)