我在理解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,因此应该返回。
答案 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