我有一个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
我检查了其他类似的帖子,但是对于像我这样的新手来说,它们似乎总是涉及功能或类似的复杂问题。请帮助
答案 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
}