我在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))
我错过了什么?
答案 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
只是创建一个字符串,即rbind
或assign
。
我认为你要找的是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
您希望合并dataset1
和dataset2
,但所有发生的事情是您在每列中添加了一个额外的行"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”的行添加到现有x
。 assign
会将其分配回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