首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环遍历df并在R中创建新的df

循环遍历df并在R中创建新的df
EN

Stack Overflow用户
提问于 2019-06-19 04:54:32
回答 3查看 154关注 0票数 0

我有一个df (10行,15列)

代码语言:javascript
运行
复制
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)))

然后我想做这样的事情:

代码语言:javascript
运行
复制
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

我曾经查看过其他类似的帖子,但对于像我这样的新手来说,它们似乎总是涉及一个功能或类似复杂的东西。请帮帮忙

EN

回答 3

Stack Overflow用户

发布于 2019-06-19 04:55:33

更新

基于新的例子

代码语言:javascript
运行
复制
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))

而且,这不需要任何循环

代码语言:javascript
运行
复制
out2 <- lm(as.matrix(df) ~ X1 + X2, data = cbind(df, df2))$residuals

年长的

代码语言:javascript
运行
复制
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)

数据

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2019-06-19 05:35:24

这可以不用循环来完成,但为了您的理解,我们可以使用循环。

代码语言:javascript
运行
复制
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,因为它们将共享相同的结构,然后使用上面的结构。

票数 1
EN

Stack Overflow用户

发布于 2019-06-19 05:04:05

我会照阿克兰的建议去做。但是,如果出于某些原因需要(或希望)循环,则可以使用:

代码语言:javascript
运行
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56660276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档