R:使用$

时间:2018-03-27 18:11:01

标签: r dataframe subset

我在理解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中没有其他类似于&#34; c&#34;那可能被误拿了?另外,如何测量部分匹配?匹配的字符的最小百分比是什么?如果使用具有未知或类似列名的数据集(例如,家庭电话与手机,这些被视为有效的部分匹配?),那么似乎有一个getElement函数会更合适。

行为问题:上面的示例temp_df[temp_df$c < 10]显示&#34;返回temp_df中元素的子集,其中列c小于10&#34;并且因为所有列c元素都符合条件,所以返回整个数据帧。我的解释显然是错误的,因为temp_df[temp_df$c < 9]返回:

  a b
1 1 4
2 2 5
3 3 6

尽管列c中的第1行和第2行元素符合小于9的条件,但省略了整个列。然后我的问题变成双重的:那个逻辑向量实际上在说/做什么?我将如何编写我的解释&#34;返回temp_df中元素的子集,其中列c小于9&#34;让它回来:

  a b c
1 1 4 7
2 2 5 8

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

2 个答案:

答案 0 :(得分:5)

尝试逐步分解操作。

temp_df$c < 9

给出如下矢量:

[1]  TRUE  TRUE FALSE

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

data.frame视为列表,列名为键,列内容为矢量值。该操作保留TRUE键(即列)并丢弃FALSE。

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

  a b c
1 1 4 7
2 2 5 8

答案 1 :(得分:1)

library(dplyr) df %>% group_by(key) %>% mutate(Date = case_when( is.na(date1) ~ max(date1, na.rm = TRUE), TRUE ~ date1) ) # A tibble: 24 x 3 # Groups: key [12] key date1 Date <chr> <date> <date> 1 a NA 2017-02-13 2 a 2017-02-13 2017-02-13 3 b NA 2017-04-14 4 b 2017-04-14 2017-04-14 5 c 2017-05-18 2017-05-18 6 c 2017-05-18 2017-05-18 7 d NA 2018-01-07 8 d 2018-01-07 2018-01-07 9 e 2017-09-24 2017-09-24 10 e 2017-09-25 2017-09-25 $都是[[运算符,它允许按名称提取元素。

OP提出了一个关于extract参数行为的查询。 exact运算符的exact参数已在[[中记录为:

  

控制[[提取时]的可能部分匹配   字符向量(对于大多数对象,但请参阅“环境”)。该   默认不是部分匹配。值NA允许部分匹配但是   发生时发出警告。值FALSE允许部分匹配   没有任何警告。

这是什么意思?要了解其行为,可以将OP使用的data.frame的RStudio更改为:

column names