mapply()中的rbind()会在R中产生不同的输出

时间:2017-09-27 17:18:45

标签: r

我刚接触R并尝试了解mapply()行为。 我有两个数据帧k1和k2。 当我使用rbind(k1,k2)时,它在k1的底部附加k2。 但是当我沿着mapply(rbind,k1,k2)使用它时,它从k1开始需要1row,而从k2开始需要1r并追加。 是否可以使用mapply()在k2之后追加k1。 你能解释一下mapply()在实时场景中的使用时间吗?

> k1 <- data.frame(x1 = 1:10, x2 = 11:20)
> k2 <- data.frame(x1= 21:30, x2 = 31:40)
> 
> rbind(k1,k2)
   x1 x2
1   1 11
2   2 12
3   3 13
4   4 14
5   5 15
6   6 16
7   7 17
8   8 18
9   9 19
10 10 20
11 21 31
12 22 32
13 23 33
14 24 34
15 25 35
16 26 36
17 27 37
18 28 38
19 29 39
20 30 40
> mapply(rbind,k1,k2)
      x1 x2
 [1,]  1 11
 [2,] 21 31
 [3,]  2 12
 [4,] 22 32
 [5,]  3 13
 [6,] 23 33
 [7,]  4 14
 [8,] 24 34
 [9,]  5 15
[10,] 25 35
[11,]  6 16
[12,] 26 36
[13,]  7 17
[14,] 27 37
[15,]  8 18
[16,] 28 38
[17,]  9 19
[18,] 29 39
[19,] 10 20
[20,] 30 40

我希望输出使用mapply()函数,就像第一个输出一样。

2 个答案:

答案 0 :(得分:1)

mapply将函数应用于第一个输入的第一个元素和第二个输入的第一个元素,第一个输入的第二个元素和第二个输入的第二个元素等。所以,因为{{1} }和k1都是数据框,k2mapply(rbind, k1, k2) rbind的第一列k1的第一列,依此类推......然后简化了输出到矩阵。

如果您想以这种方式使用k2,您可能希望使用非简化版本(mapply)并提供单个元素列表,这会强制mapply(f, ..., SIMPLIFY = FALSE)到{{ 1}} 数据帧而不是简化输出列表:

mapply

这为您提供了正确的绑定,但会生成一个元素的列表。

rbind

以下内容可为您提供与mapply(rbind, list(k1), list(k2), SIMPLIFY = FALSE) 相同的结果:

[[1]]
   x1 x2
1   1 11
2   2 12
3   3 13
4   4 14
5   5 15
6   6 16
7   7 17
8   8 18
9   9 19
10 10 20
11 21 31
12 22 32
13 23 33
14 24 34
15 25 35
16 26 36
17 27 37
18 28 38
19 29 39
20 30 40

正如@ Mako212所述,rbind(k1, k2)unlist(mapply(rbind, list(k1), list(k2), SIMPLIFY = FALSE)) 可能是在这种情况下使用的更好工具。

答案 1 :(得分:0)

听起来你可能会误用mapply()

而是创建数据框列表:

dfList <- list(k1,k2)

rbind使用Reduce就像这样:

Reduce(rbind, dfList)

另一种方式:

do.call("rbind",dfList)