我正在尝试对这样的事情进行排序:
State Value
AK 1
WA 3
LA NA
AK NA
OR 1
DL 1
然后试着找出等级2的状态。
如果我按“价值”的顺序排序,它会变成这样:
State Value
AK 1
OR 1
DL 1
WA 3
LA NA
AK NA
但那不是我想要的排名。我想按字母顺序排序,这意味着排名2应该是DL而不是OR。
我这样做的方法是使用while循环来检查是否存在上下的状态或具有相同的值,并获得具有相同值的所有状态。将它们取出并重新排序,然后绘制它们的位置。
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我已经查看了这篇帖子How to sort a dataframe by column(s)?,这确实与我想做的相似。但是,我的问题是如何处理NAs。我很高兴我的方法(我知道不是很聪明,哈哈)的另一种方法可以很好地解决我的问题,但我仍然希望这个问题我可以看到关于NAs的一些见解。
答案 0 :(得分: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
答案 1 :(得分:0)
根据您的解决方案,有些东西告诉我你来自C ++ esque编码背景,哈哈。
order
可以用作上面Josh的答案,但是,在arrange
(使用相当广泛)的软件包中使用plyr
我认为最具可读性。使用原样:
> 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>
请注意,如上所示,安排也会重置行名称,这可能是您想要的,也可能不是。