Добавление результата из вложенного l oop в строки фрейма данных в R - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь сделать al oop, чтобы иметь в списке результаты, которые получаются из l oop ниже.

Как видите, мои данные взяты из 10 электродов двух индивидуумов, и я хотел бы сравнить каждую пару электродов и смоделировать обобщенную линейную модель из нее, и именно здесь вложенная l oop пригодится. Я использовал инструкции в Заполнение фрейма данных в R в потоке al oop, и там идет мой код. Проблема в том, что он не записывает более одной строки, он не повторяется.

dfnew <- as.data.frame(matrix(NA,0,4))
x <- c("elec1", "elec2", "estimate", "pvalue")
colnames(dfnew) <- x

for (i in 1:100){ #total numbers of coincidences between the electrodes from both individuals
for (j in 1:10){ #electrodes from individual 1
  for (k in 1:10){ #electrodes from individual 2

A <- subset(dyad_data, elec1 == j & elec2 == k)

B1 <- glm(response ~ dyad , data = A, family=Gamma(link = "inverse"))

dfnew[i,1] <- print(j) #it prints the identifier of electrode from individual 1
dfnew[i,2] <- print(k) #it prints the identifier of electrode from individual 2
dfnew[i,3] <- coef(summary(B1))[2, 3]
dfnew[i,4] <- coef(summary(B1))[2, 4]


}}}

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

Вот так выглядит мое подмножество A с электродом 1 от индивидуума 1 и электродом 1 индивидуума 2, поэтому вы можете посмотреть мой тип данных:

> head(A)
     Elec1 Elec2 Dyad response
187  1     1     1    0.09312585
188  1     1     2    0.09561456
189  1     1     3    0.03530233
2374 1     1     4    0.08787908
2375 1     1     5    0.15917199
2376 1     1     6    0.02174757

Буду признателен за помощь в выявлении ошибки в моем коде.

1 Ответ

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

Вы можете использовать bind_rows для добавления строк в конец фрейма данных или rbind с матрицей:

library(dplyr)

df <- 
  tibble::tribble(
  ~Elec1, ~Elec2, ~Dyad,  ~response,
      1,      1,     1, 0.09312585,
      1,      1,     2, 0.09561456,
      1,      1,     3, 0.03530233,
      1,      1,     4, 0.08787908,
      1,      1,     5, 0.15917199,
      1,      1,     6, 0.02174757,
      1,      2,     1, 0.2,
      1,      2,     2, 0.3,
      1,      2,     3, 0.23,
      1,      2,     4, 0.43,
      1,      2,     5, 0.44,
      1,      2,     6, 0.55
  )

summary_df <- 
  tribble(~Elec1, ~Elec2, ~estimate, ~pvalue)

distinct_pairs <- 
  df %>% 
  select(Elec1, Elec2) %>% 
  distinct()

for (i in 1:nrow(distinct_pairs)) {
  model_coefs <- 
    df %>% 
    inner_join(distinct_pairs[i, ], by = c("Elec1", "Elec2")) %>% 
    glm(data = ., formula = response ~ Dyad, family = Gamma(link = "inverse")) %>% 
    summary() %>% 
    coef()

  summary_df <-
    summary_df %>% 
    bind_rows(
      c(distinct_pairs[i, ], 
        estimate = model_coefs[2, 3], 
        pvalue = model_coefs[2, 4])
    )
}

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

...