首页 > 解决方案 > 从数据框中子集一列,将子集保留为数据框

问题描述

我有一个包含过滤器的表,例如

> X = data.frame(filter1=c(1,1,1),filter2=c(1,1,0),filter3=c(1,0,0))
> X
  filter1 filter2 filter3
1       1       1       1
2       1       1       0
3       1       0       0

我喜欢根据条件选择过滤器:

> selected_filters = c(1:2)
> X[,paste0("filter",c(selected_filters))]
  filter1 filter2
1       1       1
2       1       1
3       1       0

但是,如果我只选择了一列,则数据框将转换为列表

> selected_filters = c(2)
> X[,paste0("filter",c(selected_filters))]
[1] 1 1 0

如何仅选择一列将结果保留为数据框?期望的结果看起来像

  filter2
1       1
2       1
3       0

标签: rdataframesubset

解决方案


我们需要drop = FALSE

X[, paste0("filter",c(selected_filters)), drop = FALSE]
#   filter2
#1       1
#2       1
#3       0

如果我们看一下?Extract,Usage 会显示

x[i, j, ... , drop = TRUE]

在描述中,它说

drop - 用于矩阵和数组。如果为 TRUE,则将结果强制转换为可能的最低维度(参见示例)。这仅适用于提取元素,不适用于替换。有关详细信息,请参阅下降。


请注意,subset行为是不同的,因为它是默认的drop = FALSE

subset(X, select = paste0("filter",c(selected_filters)))

推荐阅读