假设
data = structure(list(a = c(1, 2, 3), b = c(3, 2, 1)), class = "data.frame", row.names = c(NA, -3L))
此处定义的两个列是a
和b
,我们可以轻松地使用subset
对其进行子集化。但是,如果我正在查看
subset(data, select = c("a","c"))
如您所料,会返回错误:
Error in `[.data.frame`(x, r, vars, drop = drop) :
undefined columns selected
是否有一种快速/便捷的方式来子集字段,以便将缺少的列附加为缺少的列?
即,类似
data_sub <- subset.fill(data, select = c("a", "c"))
,它将返回填充的NA
不在选择中的缺失列,即:
data_sub = structure(list(a = c(1, 2, 3), c = c(NA, NA, NA)), row.names = c(NA, 3L), class = "data.frame")
答案 0 :(得分:2)
如果您的目的是维护子集功能及其属性,则可以执行以下操作:
subset.fill=function(x,...){
stopifnot(inherits(x,"data.frame"))
cl <- match.call()
nm <- eval(cl[grep("sel",names(cl))][[1]])
x[setdiff(nm,names(x))] <-NA
subset(x,...)
}
subset.fill(data,select=c("a","c"))
a c
1 1 NA
2 2 NA
3 3 NA
subset.fill(data,a>2)
a b
3 3 1
答案 1 :(得分:1)
此data.table
方法可能有效
library(data.table)
cols <- c("a","c")
首先,cols
的子集值是data
中现有的列名,然后添加带有NA的“缺失”列
setDT(data)[, .SD, .SDcols = c( intersect( cols, names(data) ) ) ][, setdiff( cols, names(data) ) := NA][]
a c 1: 1 NA 2: 2 NA 3: 3 NA
答案 2 :(得分:0)
我想不出一种超简单的方法来做到这一点。不幸的是,用NA
设置列的方式不像用NA
设置行的方式那样简单:
您可以将不存在的列预填充为NA
,然后填充子集:
vars <- c("a","c")
replace(data, setdiff(vars, names(data)), NA)[vars]
# a c
#1 1 NA
#2 2 NA
#3 3 NA
然后很容易地将此逻辑包装在函数中:
subset.fill <- function(data, x) {
data[setdiff(x, names(data))] <- NA
data[x]
}
subset.fill(data, c("a","c"))
# a c
#1 1 NA
#2 2 NA
#3 3 NA