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,因此应将其返回。
尝试分步分解操作。
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)