R Ошибка индекса при попытке добавить несколько фреймов данных в один - PullRequest
0 голосов
/ 22 января 2019

Итак, у меня массивный фрейм данных, и я пытаюсь объединить оценки, рассчитанные по нескольким фреймам данных (около 17 фреймов), с этим одним фреймом данных, и мне нужно выполнить этот процесс 12 раз. Это примерный фрейм данных, который у меня есть

df=structure(list(ï..id = structure(c(2L, 7L, 5L, 4L, 3L, 1L, 6L, 
8L), .Label = c("B12", "B7", "C2", "C9", "D3", "E2", "E6", "R4"
), class = "factor"), age = c(42L, 45L, 83L, 59L, 49L, 46L, 52L, 
23L)), class = "data.frame", row.names = c(NA, -8L))

Так что мне нужно рассчитать сетевые метрики, используя пакет igraph. Вот 2 матрицы у меня с разными людьми в них

net_mat1=structure(c("B7", "E6", "D3", "C9"), .Dim = c(2L, 2L), .Dimnames = list(
    NULL, c("ï..target", "partner")))

net_mat2=structure(c("C2", "B12", "E2", "R4"), .Dim = c(2L, 2L), .Dimnames = list(
    NULL, c("ï..target", "partner")))

Вот что я вычисляю

library(igraph)
g1=graph_from_edgelist(net_mat1)
g2=graph_from_edgelist(net_mat2)

degree_cent_close_1=centr_degree(g1, mode = "all")
degree.cent_close_1 #create object that contains metrics

degree.cent_close2=centr_degree(g2, mode = "all")
degree.cent_close2 #create another object that contains metrics 

Затем я создаю кадры данных, которые содержат метрики, которые я вычислил

cent_score_df1=data.frame(degree_cent_close_1$res, V(g1)$name)
cent_score_df1

cent_score_df2=data.frame(degree.cent_close2$res, V(g2)$name)
cent_score_df2

Затем я пытаюсь сопоставить и проиндексировать значения этих метрик обратно в df фрейм данных, выполняя это

df$centrality_scores <- cent_score_df1[ match(df[['id']], cent_score_df1[['V.g1..name']] ) , 'degree_cent_close_1.res']
df$centrality_scores



df$centrality_scores <- cent_score_df2[ match(df[['id']], cent_score_df2[['V.g2..name']] ) , 'degree.cent_close2.res']
df$centrality_scores

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

1 Ответ

0 голосов
/ 22 января 2019

Проблема с этой строкой кода в том, что вы не выбираете строки в исходном data.frame для обновления, вместо этого вы просто обновляете первые 4 строки.

df$centrality_scores <- cent_score_df1[ match(df[['id']], cent_score_df1[['V.g1..name']] ) , 'degree_cent_close_1.res']

То, что вы намеревались, былоДля этого:

df$centrality_scores<-NA
df$centrality_scores[na.omit(match(df$id, cent_score_df1$id))]<- cent_score_df1$V.g1..name

Еще один способ решить эту проблему - стандартизировать имена столбцов ваших метрических фреймов данных, а затем использовать функцию merge, чтобы добавить результаты обратно в исходный фрейм данных.

names(cent_score_df1)<-c("centrality_scores", "id")
names(cent_score_df2)<-c("centrality_scores", "id")
cent_score<-rbind(cent_score_df1, cent_score_df2)
merge(df, cent_score, by.x="id", by.y="id")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...