我刚接触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()函数,就像第一个输出一样。
答案 0 :(得分:1)
mapply
将函数应用于第一个输入的第一个元素和第二个输入的第一个元素,第一个输入的第二个元素和第二个输入的第二个元素等。所以,因为{{1} }和k1
都是数据框,k2
会mapply(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)