R:使用带有$的逻辑向量子集data.frame

Ric*_*olz 4 r subset dataframe

我在理解R的子集a时使用符号的原因行为方面遇到困难。以下示例在我正在参加的初学者课堂中提出(由于没有现场教授,所以不能在那里提问):$data.frame

temp_mat <- matrix(1:9, nrow=3)
colnames(temp_mat) <- c('a', 'b', 'c')
temp_df <- data.frame(temp_mat)
Run Code Online (Sandbox Code Playgroud)

temp_df明显调用输出:

  a b c
1 1 4 7
2 2 5 8
3 3 6 9
Run Code Online (Sandbox Code Playgroud)

本课程中给出的示例如下:

temp_df[temp_df$c < 10]
Run Code Online (Sandbox Code Playgroud)

哪个输出:

  a b c
1 1 4 7
2 2 5 8
3 3 6 9
Run Code Online (Sandbox Code Playgroud)

使用原因的问题:该过程表明$用于部分匹配,并且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
Run Code Online (Sandbox Code Playgroud)

尽管列c中的第1行和第2元素确实满足小于9的标准,但整个列均被省略。然后我的问题变成双重的:那个逻辑向量实际上在说/做什么?以及如何写出“从temp_df返回元素的子集(其中c列小于9的列)”的解释并返回:

  a b c
1 1 4 7
2 2 5 8
Run Code Online (Sandbox Code Playgroud)

因为在我看来,元素1和2(行1和2)满足该条件,因为它们的列c值小于9,因此应将其返回。

Sun*_*Bee 6

尝试分步分解操作。

temp_df$c < 9
Run Code Online (Sandbox Code Playgroud)

给出一个向量,如下所示:

[1]  TRUE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

当您按照已显示的方式传递此向量时: temp_df[c(TRUE, TRUE, FALSE)]具有对列进行操作的效果。

将a data.frame视为一个列表,列名作为键,列内容作为向量值。该操作保留TRUE键(即列),并删除FALSE。

逗号用于将向量标记为行索引。前两行将保留,最后一行将被删除。因此,temp_df[c(TRUE, TRUE, FALSE), ]给出:

  a b c
1 1 4 7
2 2 5 8
Run Code Online (Sandbox Code Playgroud)