【发布时间】:2018-09-06 06:27:35
【问题描述】:
我在理解 R 中的 data.frame 子集时 $ 符号的使用原因和行为都遇到了困难。提供了以下示例在我正在上的初学者课程中(不是现场教授,所以不能在那里问):
temp_mat <- matrix(1:9, nrow=3)
colnames(temp_mat) <- c('a', 'b', 'c')
temp_df <- data.frame(temp_mat)
调用temp_df 显然输出:
a b c
1 1 4 7
2 2 5 8
3 3 6 9
课程中给出的例子是:
temp_df[temp_df$c < 10]
哪些输出:
a b c
1 1 4 7
2 2 5 8
3 3 6 9
使用原因问题:课程指出$用于部分匹配,x$y是x[["y", exact=FALSE]]的完全替代。为什么我们要在这里使用部分匹配运算符?我们使用它是因为我们确定在我们的temp_df 中没有其他类似于“c”的列可能会被错误地拾取吗?此外,如何衡量部分匹配?至少 % 的字符匹配或什么?似乎有一个getElement 函数,如果处理具有未知或相似列名的数据集(例如,家庭电话与手机,这些会被视为有效的部分匹配吗?)
行为问题:上面的示例 temp_df[temp_df$c < 10] 似乎是在说“从 temp_df 中返回 c 列小于 10 的元素子集”,并且由于所有 c 列元素都符合条件,因此返回整个数据框。我的解释显然是错误的,因为temp_df[temp_df$c < 9] 返回:
a b
1 1 4
2 2 5
3 3 6
虽然 c 列中的第 1 行和第 2 行元素确实满足小于 9 的条件,但整个列都被省略了。然后我的问题就变成了双重问题:那个逻辑向量实际上在说/在做什么?以及我将如何编写我对“从 temp_df 中返回 c 列小于 9 的元素子集”的解释并让它返回:
a b c
1 1 4 7
2 2 5 8
因为在我看来,元素 1 和 2(第 1 行和第 2 行)满足该标准,因为它们的 c 列值小于 9,因此应该返回。
【问题讨论】:
-
尝试
temp_df[temp_df$c < 9, ]使用逗号来消除索引歧义。 -
是有道理的,现在它说的是列 c 小于 9 的行。为什么在没有逗号的情况下默认作用于列,尽管 [] 中的行排在第一位?
-
这是因为考虑数据框的最佳方式是作为一种特殊的
list,列名作为键,列内容作为向量值。默认行为基于此原则并删除标记为FALSE的键(即列)。 -
在我看来,任何课程都不应该教
temp_df[temp_df$c < 10]这个例子——这样的操作永远不会有用。 -
我同意弗兰克,现在理解它似乎一点用都没有。作为后续,为什么要使用 $ 运算符呢?如果我有一个具有类似名称列的数据集,我不想让完全匹配的机会留给机会