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