如下所示:
A <- data.frame(c(1, 2, 3))
B <- data.frame(4, 5, 6)
cbind(A, B)
c.1..2..3. X4 X5 X6
1 1 4 5 6
2 2 4 5 6
3 3 4 5 6
现在我对rbind
做转置:
At <- data.frame(1, 2, 3)
Bt <- data.frame(c(4, 5, 6))
rbind(At, Bt)
和这个不工作:
rbind(deparse。水平,…):参数的列数不匹配
有趣的是,cbind
和rbind
都支持以下内容:
cbind(A, 4, 5, 6)
c.1..2..3. 4 5 6
1 1 4 5 6
2 2 4 5 6
3 3 4 5 6
rbind(At, 4, 5, 6)
X1 X2 X3
1 1 2 3
2 4 4 4
3 5 5 5
4 6 6 6
后者是我对rbind(At, Bt)
的期望。
我怎样才能得到它?
Edit2:一些上下文:我有一个大的调用rbind(A1t, ..., B1t, A2t, ..., B2t, A3t)
,所以我更喜欢一个以某种方式处理Bit
的答案,这样我就不必修改rbind
的参数序列。(我可以用另一个替代rbind
。)
Edit3:虽然我认为cbind
和rbind
的实现是100%类似的,但这只适用于methods::cbind
和methods::rbind
。
methods::cbind
: https://github.com/wch/r-source/blob/79298c4/src/library/methods/R/cbind.R#L35-L125
methods::rbind
: https://github.com/wch/r-source/blob/79298c4/src/library/methods/R/rbind.R#L24-L114
base::cbind
: https://github.com/wch/r-source/blob/79298c4/src/main/bind.c#L1199
base::rbind
: https://github.com/wch/r-source/blob/79298c4/src/main/bind.c L1464
cbind.data.frame
: https://github.com/wch/r-source/blob/79298c4/src/library/base/R/dataframe.R#L1259
rbind.data.frame
: https://github.com/wch/r-source/blob/79298c4/src/library/base/R/dataframe.R#L1262
您可以使用do.call
来实现与rbind(At, 4, 5, 6)
相同的输出。
At <- data.frame(col1 = 1, col2 = 2, col3 = 3)
Bt <- data.frame(col1 = c(4, 5, 6))
do.call(function(...) rbind(At, ...), as.list(Bt$col1))
# col1 col2 col3
#1 1 2 3
#2 4 4 4
#3 5 5 5
#4 6 6 6
由于Bt$col1
的长度可以是可变的,所以我使用...
作为函数的参数。
rbind(At, Bt)
在这个例子中你创建了2个data.frames:
At <- data.frame(1, 2, 3)
Bt <- data.frame(c(4, 5, 6))
str(At)
'data.frame': 1 obs. of 3 variables:
$ X1: num 1
$ X2: num 2
$ X3: num 3
str(Bt)
'data.frame': 3 obs. of 1 variable:
$ c.4..5..6.: num 4 5 6
rbind
要求相同的列名,但列数不同。
rbind(At, 4, 5, 6)
在这种情况下,R "完成"每一行重复整个行的每个数字,并给出一个自动名称,例如,X1
。与
rbind(
At,
c(4,4,4),
c(5,5,5),
c(6,6,6)
)
或
rbind(
At,
data.frame(X1 = 4,X2 = 4,X3 = 4),
data.frame(X1 = 5,X2 = 5,X3 = 5),
data.frame(X1 = 6,X2 = 6,X3 = 6)
)