我有一个包含过滤器的表,例如
> 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
答案 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