给出
x<-data.frame(age=sample(1:10), gender=c("M","F"))
如何选择性别为“M”的行,并按年龄排序?
我知道我可以按年龄订购数据框: X [顺序(X $年龄),]
我可以选择性别为“M”的行: X [X $性别== 'M',]
最后,我可以同时做到: Y'LT; -x [X $性别== 'M',] Y'LT; -y [顺序(Y $年龄),]
有没有办法更简洁地做到这一点?
我试过
x[x$gender=='M' & order(x$age),]
and
x[x$gender=='M' & order(x$age),]
过滤但没有订购。
> x[x$gender=='M' &order(x$age),]
age gender
1 4 M
3 6 M
5 3 M
7 1 M
9 9 M
我也试过
x[x$gender=='M' &&order(x$age),]
似乎没有过滤或订购(我承认我不明白&amp;和&amp;&amp;)之间的区别。
age gender
1 4 M
2 5 F
3 6 M
4 2 F
5 3 M
6 10 F
7 1 M
8 8 F
9 9 M
10 7 F
我做错了什么?
注意:我的问题与the one asked here略有不同;我特意试着理解为什么我的方法不起作用。这个问题要求答案,但它和它的答案都没有帮助解释这里尝试的具体方法有什么问题。
答案 0 :(得分:3)
使用dplyr尝试此操作:
library(dplyr)
library(magrittr)
x<-data.frame(age=sample(1:10), gender=c("M","F"))
x %>%
filter(gender=="M") %>%
arrange(age)
这是输出:
age gender
1 1 M
2 2 M
3 3 M
4 7 M
5 9 M
或按降序排列:
x %>%
filter(gender=="M") %>%
arrange(desc(age))
以下是此输出:
age gender
1 9 M
2 7 M
3 3 M
4 2 M
5 1 M
答案 1 :(得分:2)
order(x$age)
is returning a vector with indexes:
order(x$age)
[1] 8 1 4 6 2 3 9 7 10 5
x$gender=='M'
returns True/False (1/0) based on that conditional:
x$gender=='M'
[1] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE
x$gender=='M' & order(x$age)
is a logical comparison in which order(x$age)
is treated as all true (as they are not 0), resulting in the same true/false as order(x$age)
.
One solution would be x[x$gender=='M',][order(x$age[x$gender=='M']),]
where you take the subset where gender = M, then use the order of this subset to order the result.
答案 2 :(得分:-1)
您的第一个方法x[x$gender=='M' & order(x$age),]
或第二个x[x$gender=='M' &&order(x$age),]
在这种情况下无法工作,因为您滥用了逻辑运算符。
就逻辑运算符而言,请参考https://stat.ethz.ch/R-manual/R-devel/library/base/html/Logic.html。
要解决这个问题,我认为你说的方式已经足够了。先排序,然后选择&#34;男性&#34;或选择&#34;男&#34;首先然后排序。如果你真的想在一行中编写代码,你可以做x[x$gender=="M",][order(x[x$gender=="M",]$age),]
,这非常难看。
使用dplyr
等其他指标也很有帮助。 (但在我这里使用它似乎太花哨了。)