Проходите через df и создайте новый df в R - PullRequest
0 голосов
/ 19 июня 2019

У меня есть df (10 строк, 15 столбцов)

df<-data.frame(replicate(15,sample(0:1,10,rep=TRUE)))

Я хочу перебрать каждый столбец, сделать что-то для каждой строки и создать новый df с ответом.Я на самом деле хочу сделать линейную регрессию для каждого столбца.Я возвращаю список для каждого столбца.Например, у меня есть второй df с тем, что я хочу вставить в lm.df2<-data.frame(replicate(2,sample(0:1,10,rep=TRUE)))

Затем я хочу сделать что-то вроде:

new_df <- data.frame()
for (i in 1:ncol(df)){
j<-lm(df[,i] ~ df2$X1 + df2$X2)
temp_df<-j$residuals
new_df[,i]<-cbind(new_df,temp_df)
}

Я получаю сообщение об ошибке:

Ошибка в data.frame (...,check.names = FALSE): аргументы подразумевают различное количество строк: 0, 8

Я проверил другие подобные посты, но они всегда, кажется, включают функцию или что-то подобное для новичка, такого как я.Пожалуйста, помогите

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Это можно сделать без циклов, но для вашего понимания, используя циклы, мы можем сделать

new_df <- df
for (i in names(df)) {
  j<-lm(df[,i] ~ df$X1 + df$X2)
  new_df[i] <- j$residuals
}

Вы инициализируете пустой фрейм данных с 0 строками и 0 столбцами, изначально как new_df, и, следовательно, когда вы пытаетесь присвоить ему значение, он выдает ошибку. Вместо этого присвойте оригинал df new_df, так как они оба будут использовать одну и ту же структуру, а затем используйте вышеописанное.

1 голос
/ 19 июня 2019

Обновление

На основе нового примера

lst1 <- lapply(names(df), function(nm) {dat <- cbind(df[nm], df2[c('X1', 'X2')])
        lm(paste0(nm,  "~ X1 + X2"), data = dat)$residuals})
out <- setNames(data.frame(lst1), names(df))

Кроме того, для этого не требуется цикл

out2 <- lm(as.matrix(df) ~ X1 + X2, data = cbind(df, df2))$residuals

Старый

We can do this easily without any loop

    new_df <- df + 10

---

If we need a loop, it can be done with `lapply`

    new_df <- df
    new_df[] <- lapply(df, function(x) x + 10)

---

Or with a `for` loop

    lst1 <- vector('list', ncol(df))
    for(i in seq_along(df)) lst1[[i]] <- df[, i] + 10
    new_df <- as.data.frame(lst1)

данные

set.seed(24)
df <- data.frame(replicate(15,sample(0:1,10,rep=TRUE)))
df2 <- data.frame(replicate(2,sample(0:1,10,rep=TRUE)))
0 голосов
/ 19 июня 2019

Я бы сделал так, как предложил Акрун.Но если вам нужно (или вы хотите) зациклить по некоторым причинам, вы можете использовать:

df<-data.frame(replicate(15,sample(0:1,10,rep=TRUE)))

new_df <- data.frame(replicate(15, rep(NA, 10)))

for (i in 1:ncol(df)){
new_df[ ,i] <- df[ , i] + 10
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...