按给定顺序在矩阵或数据框中插入不存在的列

时间:2014-02-23 12:21:49

标签: r matrix dataframe data-manipulation

我正在寻找R中的一个函数来检查特定列的存在,例如

cols=c("a","b","c","d")

在矩阵或数据框中,如果任何列不存在(在向量NA中给出列的位置),将插入带cols的列。假设您有一个带有命名列"a", "d"的矩阵或数据框,它会在列"b"之前插入一列"c"NA填充"d" s ,以及cols中未列出的任何列都将被删除(例如列"e")。实现这一目标的最简单,最快捷的方法是什么(我正在处理大约100万行的相当大的数据集)?或者是否有一些功能可以做到这一点?

3 个答案:

答案 0 :(得分:2)

我会将创建步骤和订购步骤分开。这是一个例子:

cols <- letters[1:4]
## initialize test data set
my.df <- data.frame(a = rnorm(100), d = rnorm(100), e = rnorm(100))
## exclude columns not in cols
my.df <- my.df[ , colnames(my.df) %in% cols]
## add missing columns filled with NA
my.df[, cols[!(cols %in% colnames(my.df))]] <- NA
## reorder
my.df <- my.df[, cols]

答案 1 :(得分:2)

我刚刚发现使用匹配的其他方法,但仅适用于矩阵:

# original matrix
matrix=cbind(a = 1:2, d = 3:4)
# required columns
coln=c("a","b","c","d")

colnmatrix=colnames(matrix)
matrix=matrix[,match(coln,colnmatrix)]
colnames(matrix)=coln
matrix
     a  b  c d
[1,] 1 NA NA 3
[2,] 2 NA NA 4

答案 2 :(得分:1)

如果您的数据在矩阵中,则另一种可能性

# original matrix
m1 <- cbind(a = 1:2, d = 3:4)
m1
#      a d
# [1,] 1 3
# [2,] 2 4

# matrix will all columns, filled with NA
all.cols <- letters[1:4]
m2 <- matrix(nrow = nrow(m1), ncol = length(all.cols), dimnames = list(NULL, all.cols))
m2
#       a  b  c  d
# [1,] NA NA NA NA
# [2,] NA NA NA NA

# replace columns in 'NA matrix' with values from original matrix
m2[ , colnames(m1)] <- m1
m2
#      a  b  c d
# [1,] 1 NA NA 3
# [2,] 2 NA NA 4