0

私はこのようなものを並べ替えようとしています:

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 は OR ではなく DL にする必要があります。

私がそれを行う方法は、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

そうすると、NA である LA の値と比較しようとするため、コードは機能しません。NA が表示されたときに while ループを停止するように指示したいのですが、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上記のJoshの回答のように使用できますが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 に答える