首页 > 解决方案 > 在数据框名称中使用循环

问题描述

我是 R 的新手,如果有任何帮助,我将不胜感激!

我创建了 12 个数据框,分别命名为 b1、b2、... b12。现在在每个数据帧中,我想创建一个变量“Orig”,指示数据帧的数量。

换句话说,我想编写一个与此代码相同的循环:

b1$Orig <- 1
b2$Orig <- 2
...
b12$Orig <- 12

或者作为这个:

b1 <- b1 %>%
  mutate(Orig = 1)
...
b12 <- b12 %>%
  mutate(Orig = 12)

我试过这个:

for (i in 1:n){
  paste0("b", as.character(i))[[Orig]] <- i
  }

但是得到一个错误:

paste0("b", as.character(i))[[Orig]] <- i 中的错误:赋值目标扩展为非语言对象

所以我想我需要先在循环中创建一个向量 Orig,但是 <我不知道如何。

我也试过这个:

for (i in 1:n){
  assign (paste0("b", as.character(i)), paste0("b", as.character(i)) %>% mutate(Orig = i))
  }

但是得到一个错误:

UseMethod(“mutate”)中的错误:没有适用于“mutate”的适用方法应用于“character”类的对象

在这里我尝试使用 as.data.frame 函数

for (i in 1:n){
  assign (paste0("b", as.character(i)), as.data.frame(paste0("b", as.character(i))) %>% mutate(Orig = i))
  }

,但结果我只得到 (1x1) 个带有单个数字的数据帧。

我想知道我还能做什么?非常感谢!

标签: rloops

解决方案


让我们创建一个简单的示例:

b1 <- data.frame(a=1:4, b=5:8)
B <- list(b1, b2, b3, b4)

现在添加Orig列使用lapply

B2 <- lapply(1:4, function(x) data.frame(Orig=x, B[[x]]))
B2
# [[1]]
#   Orig a b
# 1    1 1 5
# 2    1 2 6
# 3    1 3 7
# 4    1 4 8
# 
# . . . .
# 
# [[4]]
#   Orig a b
# 1    4 1 5
# 2    4 2 6
# 3    4 3 7
# 4    4 4 8

如果您现在想将标记的数据框组合成一个:

B3 <- do.call(rbind, B2)

推荐阅读