我希望能够简单而优雅地从我的data.frame中选择出数据,但我是r的新手。
这工作:
SchIndxRead %>% select(,.DormList) %>% filter(SchIndxRead$.College.Lookup=="MIAD")
我试着用这个:
SchIndxRead[SchIndxRead$.College.Lookup=='MIAD',".DormList"]
期待的只是" two ">
却得到了这个结果:
> [1] "Two50Two" NA NA NA NA
> [6] NA NA NA NA NA
> [11] NA NA NA NA NA
> [16] NA NA NA NA NA
> [21] NA NA NA NA NA
您的列.College.Lookup
可能具有NA
值,因此表达式SchIndxRead$.College.Lookup=="MIAD"
返回TRUE
's和FALSE
's,但也返回NA
's。
当您尝试使用包含NA
's的向量来子集变量时,结果也将包含NA
's:
set.seed(10)
df = tibble(a = 1:10, b = sample(c(0, 1, NA), 10, TRUE))
> df
# A tibble: 10 × 2
a b
<int> <dbl>
1 1 NA
2 2 0
3 3 1
4 4 NA
5 5 1
6 6 NA
7 7 NA
8 8 NA
9 9 NA
10 10 NA
> df$b == 1
[1] NA FALSE TRUE NA TRUE NA NA NA NA NA
> df[df$b == 1, "a"]
# A tibble: 9 × 1
a
<int>
1 NA
2 3
3 NA
4 5
5 NA
6 NA
7 NA
8 NA
9 NA
这就是为什么在你的第二次尝试中有NA
。
但dplyr::filter
"忽略"NA
的,也就是说,它过滤掉条件返回FALSE
或的行。NA
。这就是为什么在你的第一次尝试中没有NA
。
改进代码的两个提示:
- 改变
select
和filter
的顺序会更好:
SchIndxRead %>% filter(.College.Lookup == "MIAD") %>% select(.DormList)
这样你就不必在以后添加SchIndxRead$
了。
- 您可能更喜欢使用
pull()
:
SchIndxRead %>% filter(.College.Lookup == "MIAD") %>% pull(.DormList)