【问题标题】:Different results subsetting with column names具有列名的不同结果子集
【发布时间】:2015-10-24 20:56:59
【问题描述】:

如果我重复了一个问题,我很抱歉,但我是新手,我找不到答案(可能是因为我缺乏行话)。

我生成了一个这样的数据框:

x1 <- c(1,2,3,4,5)
x2 <- c("a", "b", "c", "d", "e")
df <- data.frame(x1,x2)

   x1 x2
1  1  a
2  2  b
3  3  c
4  4  d
5  5  e

然后我尝试像这样对第一列进行子集调节

df[df$x1>3, "x2"]

结果符合预期

[1] d e

但是当我尝试时

df["x1" >3, "x2"]
[1] a b c d e

R 似乎忽略了条件语句并返回整列 x2。有没有一种方法可以使用列名来评估条件语句(、==)?

编辑:我想我部分找到了答案:R 评估

"some text" > 1000 
[1] TRUE

这就解释了为什么我得到所有行。

问题仍然存在:使用列名评估条件语句的好方法是什么?

【问题讨论】:

  • 是的,df[df[["x1"]] &gt; 3, "x2"]。表达式"x1" &gt; 3 的计算结果为TRUE,因此在第二次尝试中,您正在执行df[TRUE, "x2"],这解释了结果
  • 非常感谢。做到了。

标签: r conditional subset


【解决方案1】:

我不会进行冗长的解释,因为我认为您可以通过几个示例清楚地看到问题所在。但基本上,如果您想使用字符数据框名称,您将需要这样的构造

df[df[["x1"]] > 3, "x2"]
# [1] d e
# Levels: a b c d e

第二次尝试的结果是这样的

"x1" > 3
# [1] TRUE

然后基本上你所做的是这个

df[TRUE, "x2"]
# [1] a b c d e
# Levels: a b c d e

给出所有元素。我将不得不查找为什么一个字符总是大于一个数字的确切原因。我认为这个原因之前已经在这里的某个地方详细描述过。如果我没记错的话,它与类之间的优先级有关。我看看能不能找到。

【讨论】:

    【解决方案2】:

    您的问题可能有很多答案,尤其取决于上下文和您使用的数据类型。不过,在这种特殊情况下,您可以简单地使用 df[x1 &gt; 3, "x2"]

    第一个参数用于行,第二个参数用于列。本质上,您是说返回 x1 大于 3 的所有 df 行。就列而言,您只需要 x2 列。一旦你调整了不同的语句,你会很快得到它。希望这会有所帮助。

    【讨论】:

    • df[x1 &gt; 3, "x2"] 不适用于 data.frame。它将与 data.table 一起使用,但这不是 OP 使用的。您需要df[df$x1 &gt; 3, "x2"] 中的df$
    • 另外,我认为我们应该始终在这样的前提下操作已创建。
    • @MrFlick - 谢谢,这是我的疏忽。奇怪的是,我在没有df$ 的情况下运行了这条线,只是为了确保它正常工作,出于某种原因,我得到了相同的结果。你知道发生了什么事吗? &gt; x1 &lt;- c(1,2,3,4,5) &gt; x2 &lt;- c("a", "b", "c", "d", "e") &gt; df &lt;- data.frame(x1,x2) &gt; &gt; df[df$x1 &gt; 3, "x2"] [1] d e Levels: a b c d e &gt; &gt; df[x1&gt;3, "x2"] [1] d e Levels: a b c d e
    • 这是因为要创建这个样本数据,x1 和 x2 是在数据框的外部和内部创建的。通常情况并非如此。您要确保使用数据框中的值进行子集化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2013-12-30
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多