2012-04-24 11 views
3

IはR.Rデータフレームを選択的にソートする方法は?

item index ptr 
    A  1 0.40 
    B  2 NA 
    C  3 0.30 
    D  4 0.35 
    E  5 0.44 
    F  6 NA 

における次の例示的なデータフレームがまだカラム= indexに基づいてソートさを有しています。さて、私は列ptrでそれを並べ替えるが、行の位置を残すことによって、ptr = NAが損なわれないようにしたいと思います。だから私が期待している出力は:

item index ptr 
    C  3 0.30 
    B  2 NA 
    D  4 0.35 
    A  1 0.40 
    E  5 0.44 
    F  6 NA 

普通のdf = df[order(ptr),]は動作しません。何か案は?事前に感謝します。

答えて

9

はこれを試してみてください。

> df 
    item index ptr 
1 A  1 0.40 
2 B  2 NA 
3 C  3 0.30 
4 D  4 0.35 
5 E  5 0.44 
6 F  6 NA 
> df[!is.na(df$ptr), ] <- df[order(df$ptr, na.last = NA), ] 
> df 
    item index ptr 
1 C  3 0.30 
2 B  2 NA 
3 D  4 0.35 
4 A  1 0.40 
5 E  5 0.44 
6 F  6 NA 
+0

を与えます。 –

+0

私はこのアプローチが好きです。ソリューションをありがとう。それは間違いなく簡潔でよく考えられています。 – broccoli

4
ptr.na <- is.na(df$ptr) 
order.idx <- seq(length=nrow(df)) 
ptr.idx <- which(!ptr.na) 
order.idx[!ptr.na] <- ptr.idx[order(df[ptr.idx,"ptr"])] 
df[order.idx,] 

は私のアプローチよりも簡潔な(と理解しやすい)です

> df[order.idx,] 
    item index ptr 
3 C  3 0.30 
2 B  2 NA 
4 D  4 0.35 
1 A  1 0.40 
5 E  5 0.44 
6 F  6 NA 
+0

私はあなたのアプローチが好きです。副作用がないからです。 – kohske

関連する問題