通过施加新结构从数据帧子集

时间:2019-06-07 23:37:32

标签: r dataframe data.table

假设

data = structure(list(a = c(1, 2, 3), b = c(3, 2, 1)), class = "data.frame", row.names = c(NA, -3L))

此处定义的两个列是ab,我们可以轻松地使用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")

3 个答案:

答案 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