在R中聚合多个数据集

时间:2013-12-30 05:14:03

标签: r

我在R

中有几个数据框对象
dataset1
dataset2
dataset3
...

我正在尝试使用循环使用rbind命令对它们进行行绑定,但是我很难将循环索引循环到索引数据集的字符串中。

x=dataset1
for (i in 2:n-1){
  assign(x,rbind(x,paste("dataset",i)))
}

或者以下工作会更好:

x=rbind(x,paste("dataset",i))

我错过了什么?

2 个答案:

答案 0 :(得分:2)

您只是尝试rbind多个数据框?尝试类似:

df1 <- df2 <- df3 <- mtcars

df <- do.call(rbind, list(df1, df2, df3))

我认为你缺少的是get。试试这个:

paste0('df', 1:3)

tmp <- lapply(paste0('df',1:3), get)

答案 1 :(得分:1)

两者都不起作用:paste只是创建一个字符串,即rbindassign

我认为你要找的是eval(parse(text=...))。所以这样的事情会起作用:

datasets <- sapply(1:n, function(i) paste0("dataset", i))
expr <- paste0("rbind(", paste(datasets, collapse=", "), ")")
x <- eval(parse(text=expr))

编辑:解释原始代码无效的原因

当您使用paste时,您正在创建一个字符串。例如,假设您有20个数据集,并运行以下循环:

for (i in 1:20) {
  paste("dataset", i)
}
"dataset 1"
"dataset 2"
"dataset 3"
...
"dataset 20"

那么现在如果您尝试rbind某些数据集会发生什么?让我们尝试使用虚拟数据集:

dataset1 <- head(mtcars)
dataset1
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

i <- 2
x <- rbind(dataset1, paste("dataset", i)
x
##                         mpg       cyl      disp        hp      drat        wt      qsec        ## vs        am      gear      carb
## Mazda RX4                21         6       160       110       3.9      2.62     16.46         ## 0         1         4         4
## Mazda RX4 Wag            21         6       160       110       3.9     2.875     17.02         ## 0         1         4         4
## Datsun 710             22.8         4       108        93      3.85      2.32     18.61         ## 1         1         4         1
## Hornet 4 Drive         21.4         6       258       110      3.08     3.215     19.44         ## 1         0         3         1
## Hornet Sportabout      18.7         8       360       175      3.15      3.44     17.02         ## 0         0         3         2
## Valiant                18.1         6       225       105      2.76      3.46     20.22         ## 1         0         3         1
## 7                 dataset 2 dataset 2 dataset 2 dataset 2 dataset 2 dataset 2 dataset 2 ## dataset 2 dataset 2 dataset 2 dataset 2

您希望合并dataset1dataset2,但所有发生的事情是您在每列中添加了一个额外的行"dataset 2"!如果您尝试运行,则会在第二个代码块中发生这种情况:

x=rbind(x,paste("dataset",i))

现在你的第一个代码块出了什么问题:

x=dataset1
for (i in 2:n-1){
  assign(x,rbind(x,paste("dataset",i)))
}

首先,您将收到此错误:

Error in assign(x, rbind(x, paste("dataset", i))) : 
  invalid first argument

assign实际上是一个字符串,而不是一个变量,并为它赋予一些值:

assign("y", 5)
y
## [1] 5

这就是你看到错误的原因。那么,如果您将其更改为"x"会发生什么?:

x=dataset1
for (i in 2:n-1){
  assign("x",rbind(x,paste("dataset",i)))
}

这是assign命令的第二个参数,你已经看到了上面的内容。它会将包含“dataset i”的行添加到现有xassign会将其分配回x。所以最终的结果是:

                         mpg        cyl       disp         hp       drat         wt       qsec         vs         am       gear       carb
Mazda RX4                 21          6        160        110        3.9       2.62      16.46          0          1          4          4
Mazda RX4 Wag             21          6        160        110        3.9      2.875      17.02          0          1          4          4
Datsun 710              22.8          4        108         93       3.85       2.32      18.61          1          1          4          1
Hornet 4 Drive          21.4          6        258        110       3.08      3.215      19.44          1          0          3          1
Hornet Sportabout       18.7          8        360        175       3.15       3.44      17.02          0          0          3          2
Valiant                 18.1          6        225        105       2.76       3.46      20.22          1          0          3          1
7                  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2
8                  dataset 1  dataset 1  dataset 1  dataset 1  dataset 1  dataset 1  dataset 1  dataset 1  dataset 1  dataset 1  dataset 1
9                  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2  dataset 2
10                 dataset 3  dataset 3  dataset 3  dataset 3  dataset 3  dataset 3  dataset 3  dataset 3  dataset 3  dataset 3  dataset 3
11                 dataset 4  dataset 4  dataset 4  dataset 4  dataset 4  dataset 4  dataset 4  dataset 4  dataset 4  dataset 4  dataset 4
12                 dataset 5  dataset 5  dataset 5  dataset 5  dataset 5  dataset 5  dataset 5  dataset 5  dataset 5  dataset 5  dataset 5
13                 dataset 6  dataset 6  dataset 6  dataset 6  dataset 6  dataset 6  dataset 6  dataset 6  dataset 6  dataset 6  dataset 6
14                 dataset 7  dataset 7  dataset 7  dataset 7  dataset 7  dataset 7  dataset 7  dataset 7  dataset 7  dataset 7  dataset 7
15                 dataset 8  dataset 8  dataset 8  dataset 8  dataset 8  dataset 8  dataset 8  dataset 8  dataset 8  dataset 8  dataset 8
16                 dataset 9  dataset 9  dataset 9  dataset 9  dataset 9  dataset 9  dataset 9  dataset 9  dataset 9  dataset 9  dataset 9
17                dataset 10 dataset 10 dataset 10 dataset 10 dataset 10 dataset 10 dataset 10 dataset 10 dataset 10 dataset 10 dataset 10
18                dataset 11 dataset 11 dataset 11 dataset 11 dataset 11 dataset 11 dataset 11 dataset 11 dataset 11 dataset 11 dataset 11
19                dataset 12 dataset 12 dataset 12 dataset 12 dataset 12 dataset 12 dataset 12 dataset 12 dataset 12 dataset 12 dataset 12
20                dataset 13 dataset 13 dataset 13 dataset 13 dataset 13 dataset 13 dataset 13 dataset 13 dataset 13 dataset 13 dataset 13
21                dataset 14 dataset 14 dataset 14 dataset 14 dataset 14 dataset 14 dataset 14 dataset 14 dataset 14 dataset 14 dataset 14
22                dataset 15 dataset 15 dataset 15 dataset 15 dataset 15 dataset 15 dataset 15 dataset 15 dataset 15 dataset 15 dataset 15
23                dataset 16 dataset 16 dataset 16 dataset 16 dataset 16 dataset 16 dataset 16 dataset 16 dataset 16 dataset 16 dataset 16
24                dataset 17 dataset 17 dataset 17 dataset 17 dataset 17 dataset 17 dataset 17 dataset 17 dataset 17 dataset 17 dataset 17
25                dataset 18 dataset 18 dataset 18 dataset 18 dataset 18 dataset 18 dataset 18 dataset 18 dataset 18 dataset 18 dataset 18
26                dataset 19 dataset 19 dataset 19 dataset 19 dataset 19 dataset 19 dataset 19 dataset 19 dataset 19 dataset 19 dataset 19