遍历df并在R中创建新的df

时间:2019-06-19 04:54:32

标签: r

我有一个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 个答案:

答案 0 :(得分:1)

更新

基于新示例

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)))

答案 1 :(得分:1)

这可以不使用循环而完成,但是据您所知,使用循环我们可以做到

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,不如将它们共享相同的结构,然后使用上面的结构。

答案 2 :(得分:0)

我会按照akrun的建议去做。但是,如果出于某些原因确实需要(或想要)循环,则可以使用:

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
}