我有一个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
我曾经查看过其他类似的帖子,但对于像我这样的新手来说,它们似乎总是涉及一个功能或类似复杂的东西。请帮帮忙
发布于 2019-06-18 20:55:33
更新
基于新的例子
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)))
发布于 2019-06-18 21:35:24
这可以不用循环来完成,但为了您的理解,我们可以使用循环。
new_df <- df
for (i in names(df)) {
j<-lm(df[,i] ~ df$X1 + df$X2)
new_df[i] <- j$residuals
}
您正在初始化一个空的dataframe,其中0行和0列最初为new_df
,因此当您试图将值赋值时,它会给出一个错误。而不是将原始的df
分配给new_df
,因为它们将共享相同的结构,然后使用上面的结构。
发布于 2019-06-18 21:04:05
我会照阿克兰的建议去做。但是,如果出于某些原因需要(或希望)循环,则可以使用:
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
}
https://stackoverflow.com/questions/56660276
复制