R: Správně volat proměnnou, která obsahuje "i"

0

Otázka

Já jsem pracoval s R programovací jazyk. Mám následující kód, který vytvoří 100 datových sad (obsahující pevné složky a náhodné složky):

a = rnorm(300,10,5)
b = rnorm(300,3,1)
c = rnorm(300,12,1)
e = "original"
d = data.frame(a,b,c,e)


results <- list()

for (i in 1:100){

a = rnorm(100,10,10)
b = rnorm(100,10,10)
c = rnorm(100,10,10)
e = "simulated"

d_i = data.frame(a,b,c,e)

data_i = rbind(d, d_i)
data_i$iteration = i
 results[[i]] <- data_i

}



results_df <- do.call(rbind.data.frame, results)

V okamžiku, kdy se tyto 100 datové soubory byly umístěny ve stejném souboru ("results_df"). Teď chci prolomit "results_df" soubor do každého z těchto 100 datových souborů (pomocí "iterace" sloupec jako index):

results_df$iteration = as.factor(results_df$iteration)
X<-split(results_df, results_df$iteration)

To "X" soubor se zdá být "seznam" s každým z 100 datových souborů v seznamu uvedené takto:

enter image description here

Mám přístup každý z těchto souborů tím, že volá "index" pomocí i , např.

> head(X$`1`)
          a        b        c        e iteration
1  2.141495 3.984072 12.73344 original         1
2  8.769269 4.267464 11.32566 original         1
3  5.413573 2.823608 12.06713 original         1
4 11.710470 3.710500 12.20715 original         1
5 14.423155 2.944178 10.56673 original         1
6  6.886629 2.843195 12.43074 original         1
> head(X$`2`)
            a        b        c        e iteration
401  2.141495 3.984072 12.73344 original         2
402  8.769269 4.267464 11.32566 original         2
403  5.413573 2.823608 12.06713 original         2
404 11.710470 3.710500 12.20715 original         2
405 14.423155 2.944178 10.56673 original         2
406  6.886629 2.843195 12.43074 original         2
> head(X$`98`)
              a        b        c        e iteration
38801  2.141495 3.984072 12.73344 original        98
38802  8.769269 4.267464 11.32566 original        98
38803  5.413573 2.823608 12.06713 original        98
38804 11.710470 3.710500 12.20715 original        98
38805 14.423155 2.944178 10.56673 original        98
38806  6.886629 2.843195 12.43074 original        98

Moje Otázka: nyní bych chtěl napsat další funkci, která provede lineární regrese na každý z těchto 100 datových souborů, šetří regresní koeficienty, a umístí je do jednoho souboru. Snažil jsem se psát kód pro tento:

results_1 <- list()

for (i in 1:100){

model_i <- lm(a ~ b +c, data = X$`i`)
coeff_i = model_i$coefficients

 results_1[[i]] <- coeff_i 

}

results_df_1 <- do.call(rbind.data.frame, results_1)

Na první pohled, zdá se, že pracoval - ale to je zobrazení všech regresních koeficientů jako stejné. To je nemožné, jelikož regresní model byl běh 100 krát na různých datových souborů :

#for some reason, the column names have been corrupted

hist(results_df_1$c.14.5741211250235..14.5741211250235..14.5741211250235..14.5741211250235.., main = "first coeff")

 hist(results_df_1$c..0.105285805666629...0.105285805666629...0.105285805666629.., main = "second coeff")

 hist(results_df_1$c..0.236548691738492...0.236548691738492...0.236548691738492.., main = "third coeff")

enter image description here

Může mi někdo prosím, pomozte mi vyřešit tento problém? Při použití "split()" funkce v R, je to správný způsob, jak "call", "split komponenty" v budoucnu příkazy ?

model_i <- lm(a ~ b +c, data = X$`i`)

Díky!!!

data-manipulation function loops r
2021-11-23 05:07:10
1

Nejlepší odpověď

0

Byl jsem schopen opravit tento problém:

a = rnorm(300,10,5)
b = rnorm(300,3,1)
c = rnorm(300,12,1)
e = "original"
d = data.frame(a,b,c,e)


results <- list()

for (i in 1:100){

a = rnorm(100,10,10)
b = rnorm(100,10,10)
c = rnorm(100,10,10)
e = "simulated"

d_i = data.frame(a,b,c,e)

data_i = rbind(d, d_i)
data_i$iteration = i
 results[[i]] <- data_i

}



results_df <- do.call(rbind.data.frame, results)

X<-split(results_df, results_df$iteration)

#####

results_1 <- list()

for (i in 1:100){

#here was the problem
model_i <- lm(a ~ b +c, data = X[[i]])

coeff_i = model_i$coefficients

 results_1[[i]] <- model_i$coefficients

}

results_df_1 <- do.call(rbind.data.frame, results_1)

par(mfrow = c(1, 3))

hist(results_df_1[,1], main = "first coeff")
hist(results_df_1[,2], main = "second coeff")
hist(results_df_1[,3], main = "third coeff")

enter image description here

2021-11-23 05:48:18

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................