【问题标题】:Subset one column from data frame keeping the subset as a data frame [duplicate]从数据框中子集一列,将子集保留为数据框[重复]
【发布时间】:2019-09-06 04:27:47
【问题描述】:

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

> 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

【问题讨论】:

  • 问题的一部分实际上是试图找到正确的文档,因为对于方括号语法X[...] 不能使用语法?[] 寻求帮助并不明显。正如@acrun 在他的回答中指出的那样,应该寻求语法?Extract 的帮助。
  • 我们可以像使用任何其他功能一样获得帮助:?"[" 将带我们到 Extract 手册。同样?"+" 会带我们去算术
  • 请注意,您可以在建议的解决方案中使用selected_filters 而不是c(selected_filters)

标签: r dataframe subset


【解决方案1】:

如果您避免使用逗号,您将获得一个数据框。

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

【讨论】:

    【解决方案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)))
    

    【讨论】:

    • 我不确定我的答案是否与您的相同...即drop = TRUE 与选择不带逗号相同...?
    • @Sotos,不,没关系 :=)
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 2013-12-23
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多