是否有可能将NA强制转换为R中的逻辑?

时间:2016-02-26 17:53:32

标签: r sorting na coerce

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

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的一些见解。

2 个答案:

答案 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>

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