r - 更快地填充 R 数据框中缺失的列

标签 r dataframe cbind

任何 R 专家都可以提供一种更快的方法来执行以下操作吗?我的代码可以运行,但执行 30,000-[列] x 12-[行] 数据框需要 1 分钟。谢谢!

    sync.columns = function(old.data, new.colnames)
    {
      # Given a data frame and a vector of column names,
      # makes a new data frame containing exactly the named
      # columns in the specified order; any that were not
      # present are filled in as columns of zeroes.

      if (length(new.colnames) == ncol(old.data) && 
          all(new.colnames == colnames(old.data)))
      {
        old.data    # nothing to do
      }
      else
      {
        m = matrix(nrow=nrow(old.data),ncol=length(new.colnames))

        for (t in 1:length(new.colnames))
        {
          if (new.colnames[t] %in% colnames(old.data))
          {
            m[,t] = old.data[,new.colnames[t]]   # copy column
          }
          else
          {
            m[,t] = rep(0,nrow(m))   # fill with zeroes
          }
        }
        result = as.data.frame(m)
        rownames(result) = rownames(old.data)
        colnames(result) = new.colnames
        result
      }
    }

也许有 cbind 的东西?

最佳答案

这看起来相当快。首先创建一个全为 0 的 data.frame,然后只替换您在旧数据中可以找到的内容:

sync.columns <- function(old.data, new.colnames) {
   M  <- nrow(old.data)
   N  <- length(new.colnames)
   rn <- rownames(old.data)
   cn <- new.colnames
   new.data <- as.data.frame(matrix(0, M, N, dimnames = list(rn, cn)))
   keep.col <- intersect(cn, colnames(old.data))
   new.data[keep.col] <- old.data[keep.col]
   new.data
}

M <- 30000
x <- data.frame(b = runif(M), i = runif(M), z = runif(M))
rownames(x) <- paste0("z", 1:M)
system.time(y <- sync.columns(x, letters[1:12]))
#    user  system elapsed 
#   0.031   0.010   0.043

head(y)
#    a          b c d e f g h         i j k l
# z1 0 0.27994248 0 0 0 0 0 0 0.3785181 0 0 0
# z2 0 0.75291520 0 0 0 0 0 0 0.7414294 0 0 0
# z3 0 0.07036461 0 0 0 0 0 0 0.1543653 0 0 0
# z4 0 0.40748957 0 0 0 0 0 0 0.5564374 0 0 0
# z5 0 0.98769595 0 0 0 0 0 0 0.4277466 0 0 0
# z6 0 0.82117781 0 0 0 0 0 0 0.2034743 0 0 0

编辑:在下面的 OP 评论之后,这是一个矩阵版本:

sync.columns <- function(old.data, new.colnames) {
  M  <- nrow(old.data)
  N  <- length(new.colnames)
  rn <- rownames(old.data)
  cn <- new.colnames
  new.data <- matrix(0, M, N, dimnames = list(rn, cn))
  keep.col <- intersect(cn, colnames(old.data))
  new.data[, keep.col] <- old.data[, keep.col]
  new.data
}

x <- t(as.matrix(x)) # a wide matrix
system.time(y <- sync.columns(x, paste0("z", sample(1:50000, 30000))))
#    user  system elapsed 
#   0.049   0.002   0.051 

关于r - 更快地填充 R 数据框中缺失的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22901321/

相关文章:

r - 合并 2 个具有重复列的数据框?

r - 手动为ggplot2中的长X标签创建缩写图例

r - 如何在需要时使用 testthat 将消息和警告静音

R 在 data.table 中部分填充 NA

r - lm 输出的逐列 cbind

r - 如何创建带有数字和字符列的数据框?

r - 按名称在 R 中 cbind 命名向量

python - 将两个数据帧连接到第二个数据帧内的值

python - 用向量/列表元素展平数据框python

java - Spark/Scala - 从 Json 创建 DataFrame 时出错 : java. lang.NoSuchMethodError : org. apache.spark.sql.DataFrameReader.json