当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R cbind 按行或列组合 R 对象


R语言 cbind 位于 base 包(package)。

说明

获取向量、矩阵或 data-frame 参数的序列并按以下方式组合c列或rows,分别。这些是通用函数,具有其他方法R类。

用法

cbind(..., deparse.level = 1)
rbind(..., deparse.level = 1)
## S3 method for class 'data.frame'
rbind(..., deparse.level = 1, make.row.names = TRUE,
      stringsAsFactors = FALSE, factor.exclude = TRUE)

参数

...

(广义)向量或矩阵。这些可以作为命名参数给出。其他R可以适当地强制对象,或者可以使用 S4 方法:请参阅“详细信息”和“值”部分。 (为了"data.frame"的方法cbind这些可以作为进一步的参数data.framestringsAsFactors.)

deparse.level

在非类矩阵参数的情况下控制标签构造的整数(对于默认方法):
deparse.level = 0不构造标签;
默认值deparse.level = 1通常和deparse.level = 2始终从参数名称构造标签,请参阅下面的“值”部分。

make.row.names

(仅适用于 DataFrame 方法:)逻辑指示是否应从参数构造唯一且有效的row.names

stringsAsFactors

逻辑,传递给as.data.frame;仅当 ... 参数包含(非 data.frame )character 时才有效。

factor.exclude

如果 DataFrame 包含因子,则默认TRUE确保NA因子水平保持不变,参见公关#17562和“ DataFrame 方法”。在R版本高达 3.6.x,factor.exclude = NA已被隐式硬编码(R<= 3.6.0) 或默认值 (R= 3.6.x,x >= 1)。

细节

函数 cbindrbind 是 S3 通用函数,具有数据帧方法。如果至少一个参数是 DataFrame ,其余参数是向量或矩阵,则将使用 DataFrame 方法。还可以有其他方法;特别是,有一个用于时间序列对象的。有关如何选择要使用的方法的信息,请参阅“调度”部分。如果某些参数属于 S4 类,即 isS4(.) 为 true,则还会查找 S4 方法,并且可能会调用包 methods 中的隐藏 cbind /rbind 函数,这些函数又分别构建在cbind2rbind2 。在这种情况下,与默认方法类似,遵循 deparse.level

在默认方法中,所有向量/矩阵必须是原子的(请参阅vector)或列表。不允许使用表达式。语言对象(例如公式和调用)和配对列表将被强制为列表:其他对象(例如名称和外部指针)将作为元素包含在列表结果中。输入可能具有的任何类都将被丢弃(特别是,因子被其内部代码替换)。

如果有多个矩阵参数,它们必须具有相同的列数(或行数),这将是结果的列数(或行数)。如果所有参数都是向量,则结果中的列(行)数等于最长向量的长度。较短参数中的值将被回收以达到此长度(如果仅部分回收,则使用 warning)。

当参数由矩阵和向量混合组成时,结果的列(行)数由矩阵参数的列(行)数确定。任何向量都会对其值进行回收或子集化以达到此长度。

为了cbind(rbind),零长度向量(包括NULL)将被忽略,除非结果为零行(列),以实现 S 兼容性。 (Zero-extent 矩阵不会出现在 S3 中,并且不会在 S3 中被忽略R.)

矩阵限制为小于 即使在 64 位系统上也可以显示行和列。因此输入向量具有相同的长度限制:从R3.2.0 允许具有更多元素(但满足行和列限制)的输入矩阵。

对于默认方法,是按列或按行组合 ... 参数的矩阵。 (异常:如果没有输入或所有输入均为 NULL ,则值为 NULL 。)

矩阵结果的类型由层次结构中任何输入的最高类型确定 raw <逻辑<整数<双精度<复杂<字符<列表。

对于 cbind ( rbind ),如果参数是类似矩阵的,则列(行)名称取自参数的 colnames ( rownames )。否则,从参数名称或未提供参数的名称和 deparse.level > 0 ,通过解析给定的表达式,仅当给出合理名称时才为 deparse.level = 1 (‘symbol’,请参阅 is.symbol )。

对于 cbind ,行名称取自具有适当名称的第一个参数:矩阵的行名称,或长度为结果行数的向量的名称。

对于rbind,列名称取自具有适当名称的第一个参数:矩阵的列名称,或长度为结果列数的向量的名称。

DataFrame 方法

cbind 数据帧方法只是 data.frame(..., check.names = FALSE) 的包装。这意味着它将拆分数据帧参数中的矩阵列,并将字符列转换为因子,除非指定了 stringsAsFactors = FALSE

rbind 数据帧方法首先删除所有zero-column 和zero-row 参数。 (如果没有,则返回第一个带有列的参数,否则返回 zero-column zero-row DataFrame 。)然后,它从第一个 DataFrame 中获取列的类,并按名称(而不是按位置)匹配列。因子的级别根据需要扩展(按照遇到的因子的级别集的级别的顺序),并且当且仅当所有组件都是有序因子时,结果才是有序因子。 (最后一点与 S-PLUS 不同。)Old-style 类别(带级别的整数向量)被提升为因子。

请注意,对于结果列 j ,应用 factor(., exclude = X(j)),其中

  X(j) := if(isTRUE(factor.exclude)) {
             if(!NA.lev[j]) NA # else NULL
          } else factor.exclude

其中 NA.lev[j] 为 true,当且仅当任何贡献数据帧在 j 列中具有显式 NA 级别的 factor

派遣

方法调度不是通过 UseMethod() 完成的,而是通过 C-internal 调度完成的。因此,不需要 rbind.default 等。

调度算法在源文件中说明(‘.../src/main/bind.c') 作为

  1. 对于每个参数,我们从类属性中获取可能的类成员资格列表。

  2. 我们依次检查每个类,看看是否有适用的方法。

  3. 如果我们找到一种方法,我们就会使用它。否则,如果参数中有 S4 对象,我们尝试 S4 调度;否则,我们使用默认代码。

如果要将其他对象与 DataFrame 组合,可能需要首先将它们强制为 DataFrame 。 (请注意,如果所有参数都是数据帧或向量,则此算法可能会导致调用数据帧方法,这将导致将字符向量强制转换为因子。)

例子

m <- cbind(1, 1:7) # the '1' (= shorter vector) is recycled
m
m <- cbind(m, 8:14)[, c(1, 3, 2)] # insert a column
m
cbind(1:7, diag(3)) # vector is subset -> warning

cbind(0, rbind(1, 1:3))
cbind(I = 0, X = rbind(a = 1, b = 1:3))  # use some names
xx <- data.frame(I = rep(0,2))
cbind(xx, X = rbind(a = 1, b = 1:3))   # named differently

cbind(0, matrix(1, nrow = 0, ncol = 4)) #> Warning (making sense)
dim(cbind(0, matrix(1, nrow = 2, ncol = 0))) #-> 2 x 1

## deparse.level
dd <- 10
rbind(1:4, c = 2, "a++" = 10, dd, deparse.level = 0) # middle 2 rownames
rbind(1:4, c = 2, "a++" = 10, dd, deparse.level = 1) # 3 rownames (default)
rbind(1:4, c = 2, "a++" = 10, dd, deparse.level = 2) # 4 rownames

## cheap row names:
b0 <- gl(3,4, labels=letters[1:3])
bf <- setNames(b0, paste0("o", seq_along(b0)))
df  <- data.frame(a = 1, B = b0, f = gl(4,3))
df. <- data.frame(a = 1, B = bf, f = gl(4,3))
new <- data.frame(a = 8, B ="B", f = "1")
(df1  <- rbind(df , new))
(df.1 <- rbind(df., new))
stopifnot(identical(df1, rbind(df,  new, make.row.names=FALSE)),
          identical(df1, rbind(df., new, make.row.names=FALSE)))

参考

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

也可以看看

c 将向量(和列表)组合为向量,data.frame 将向量和矩阵组合为数据帧。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Combine R Objects by Rows or Columns。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。