0

我正在尝试对这样的事情进行排序:

State     Value
   AK         1
   WA         3
   LA        NA
   AK        NA
   OR         1
   DL         1

然后尝试找到说 rank 2 的状态。

如果我按“价值”的顺序排序,它会变成这样:

State     Value
   AK         1
   OR         1
   DL         1
   WA         3
   LA        NA
   AK        NA

但这不是我想要的排名。我想按字母顺序对其进行排序,这意味着排名 2 应该是 DL 而不是 OR。

我这样做的方法是使用while循环来检查是否有高于和低于OR的状态具有相同的值,并获得具有相同值的所有状态。将它们取出并重新排序,然后绘制它们的位置。

count <- 2
ucount <- 0
dcount <- count

while (data$Value[count] == data$Value[count + 1]) {
    dcount <- dcount + 1
    count <- dcount
}

count <- num

while (data$Value[count] == data$Value[count - 1]) {
    ucount <- ucount + 1
    count <- count - 1
}

if (dcount == 2 && ucount == 0) {
    result <- as.character(data$State[2])
}

else if (dcount != num) {
    result <- as.character(sort(data[ucount:dcount, "State"])[1])
}

else {
    result <- as.character(sort(data[ucount:dcount, "State"])[ucount + 1])
}

result

这段代码,虽然丑陋,但只有在下面没有 NA 值时才有效。

如果我们没有

State     Value
   WA         3

数据框将变为

State     Value
   AK         1
   OR         1
   DL         1
   LA        NA
   AK        NA

然后代码将不起作用,因为它会尝试与 LA 的值进行比较,即 NA。我想告诉 while 循环在看到 NA 时停止,但 R 似乎不允许我对 NA 做任何事情。

我知道这可能不是很聪明,但这是我能想到的唯一方法。我对 R 还是很陌生,我希望这不是一个愚蠢的问题。谢谢你的帮助!

PS我已经检查了这篇文章如何按列对数据框进行排序?,这确实与我想做的类似。但是,我的问题是关于如何处理 NA。我很高兴我的方法有另一种方法(我知道这不是很聪明,哈哈)可以很好地解决我的问题,但我仍然希望通过这个问题我能看到一些关于 NA 的见解。

4

2 回答 2

3

该函数order()接受多个参数,允许您先排序Value,然后 - 以打破任何关系 - 按字母顺序State

df[order(df$Value, as.character(df$State),]
  State Value
1    AK     1
6    DL     1
5    OR     1
2    WA     3
4    AK    NA
3    LA    NA
于 2016-02-26T17:59:27.990 回答
0

根据您的解决方案,有些东西告诉我您来自 C++ 风格的编码背景,哈哈。

order可以像上面乔希的回答一样使用,但是,arrangeplyr我认为最易读的(相当广泛使用的)包中使用。像这样使用:

> library(plyr)
> DF <- data.frame(State = c("AK", "WA", "LA", "AK", "OR", "DL"), Value = c("1", "3", NA, NA, "1", "1"))
> DF
  State Value
1    AK     1
2    WA     3
3    LA  <NA>
4    AK  <NA>
5    OR     1
6    DL     1
> DF <- arrange(DF, Value, State) # Sort by Value, then by State.
> DF
  State Value
1    AK     1
2    DL     1
3    OR     1
4    WA     3
5    AK  <NA>
6    LA  <NA>

请注意,如上所示,arrange 还会重置行名称,这可能是您想要的,也可能不是。

于 2016-02-26T18:16:11.937 回答