按因子

时间:2015-12-04 21:08:08

标签: r

给出

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略有不同;我特意试着理解为什么我的方法不起作用。这个问题要求答案,但它和它的答案都没有帮助解释这里尝试的具体方法有什么问题。

3 个答案:

答案 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等其他指标也很有帮助。 (但在我这里使用它似乎太花哨了。)