子集数据帧中的一列,将子集保留为数据帧

时间:2019-04-16 06:32:24

标签: r dataframe subset

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

> 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

2 个答案:

答案 0 :(得分:2)

我们需要drop = FALSE

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

如果我们查看?Extract,用法将显示

  

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

并在说明中说

  

drop-用于矩阵和数组。如果为TRUE,则结果强制为最小尺寸(请参见示例)。这仅适用于提取元素,不适用于替换。有关更多详细信息,请参见drop。


请注意,subset的行为有所不同,因为默认情况下是drop = FALSE

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

答案 1 :(得分:2)

如果避免逗号,则会得到一个数据框。

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

str(X[paste0("filter", c(selected_filters))])
'data.frame':   3 obs. of  1 variable:
 $ filter2: num  1 1 0

str(X[,paste0("filter", c(selected_filters))])
 num [1:3] 1 1 0
相关问题