2

data.frame約 250,000 行と 7 列を含むa を並べ替えようとしています。の一番上に必要な行はdata.frame、列 2 に最小値が含まれ、列 7 に最大値が含まれている行ですが、最小値から最大値への値を含むこの列のシーケンスになります: 2,5,1,4,6,3 ,7 (したがって、列 5 は 2 番目に低い値などになります)。

このシーケンスに一致する行が識別されると、列の値が 2、5、1、4、6、次に 2、5、1、4 という順序で最小から最大になる行を検索します。列 2 が最も低く、他の列の値がランダムに分類される行のみ。最小値として列 2 を持たない行は無視され、並べ替えられた行の下に並べ替えられずに残されます。私は自分の問題に対する実行可能な解決策を考え出すのに苦労しています-私が取り組んでいるのと同様のデータを提供するという点で私ができる最善のことはこれです:

df<-data.frame(matrix(rnorm(70000), nrow=10000))
df<-abs(df)

誰かに何かアイデアがあれば、私はすべて耳にします。ありがとう!

4

4 に答える 4

2

均一なタイプ(数値)の大規模なデータセットがある場合、data.frameではなくマトリックスを使用することをお勧めします

 tt <- abs(matrix(rnorm(70000), nrow=10000))

一致させたい注文があります

 desiredOrder <- c(2,5,1,4,6,3,7)

各行の順序を見つける必要があります。ここでは、各行の要素を含むリストが返されるようにするのが最も簡単だと思います。このようなものをお勧めします。

 orders <- lapply(apply(tt, 1, function(x) list(order(x))), unlist)

次に、(特定の行の注文の必要なサブセットが目的の注文の必要なサブセットと等しい場合をテストするために(からからへ)を通過する必要があります。(との組み合わせをdesiredOrder[seq_len(7)]考え ています)desiredOrder[seq_len(1)]sapplywhichall

必要な結果に一致するすべての行を特定したら、 を使用して一致しない行を見つけ、このベクトルを使用してsetdiff並べ替えることができます。ttnew order

于 2013-01-11T01:45:23.213 に答える
0

インデックスを順序にorder()戻すという事実を使用できます。 これは、まさに一致させようとしているものです。

For example if we apply `order` twice to each row of 
  [1,]   23   17  118   57   20   66  137
  [2,]   56   42   52   66   47    8   29
  [3,]   35    5   76   35   29  217   89

We would get
  [1,]    2    5    1    4    6    3    7
  [2,]    6    7    2    5    3    1    4
  [3,]    2    5    1    4    3    7    6

次に、探している行と一致する行を確認するだけです。



これを実装する方法はいくつかあります。以下に例を示します。ここでは、で示されているように、行の各要素が 「正しい」位置にあるかどうかを示す
論理行列を作成します。次に、「正しい列」にある 要素の数で元の行を並べ替えます。(もちろん、このフレーズを大まかに使用します)comparisons
expectedOrder


# assuming mydf is your data frame or matrix

# the expected order of the columns
expectedOrder <- c(2,5,1,4,6,3,7)

# apply the order function twice. 
ordering <- apply(mydf, 1, function(r) order(r) )  

# Recall that the output of apply is transposed relative to the input. 
# We make use of this along with the recycling of vectors for the comparison
comparisons <-  ordering == expectedOrder

# find all rows with at least matches to 2,5,1,4
topRows  <- which(colSums(comparisons[1:4, ])==4)

# reorder the indecies based on the total number of matches in comparisons
#  ie:  first all 7-matches, then 5-matches, then 4-matches
topRows <- topRows[order(colSums(comparisons[,topRows]), decreasing=TRUE)]

# reorder the dataframe (or matrix) 
mydf.ordered <- 
  rbind(mydf[topRows, ],  
        mydf[-topRows,])

head(mydf.ordered)
 #    X1 X2  X3  X4  X5  X6  X7
 #    23 17 118  57  20  66 137
 #    39 21 102  50  24  53 163
 #    80  6 159 116  44 139 248
 #   131  5 185 132 128 147 202
 #    35 18  75  40  33  67 151
 #    61 14 157  82  57 105 355
于 2013-01-11T06:55:00.280 に答える
0

考えられるアプローチの 1 つは、列内の値のランキングに重みを付けることです。ランク回帰のようなものです。250K 行の 7 列はそれほど大きくありません。低い値の重みを高くしたい場合は、NROW(dfrm) からランクを引くことができます。その列の順序付けスキーム全体で重み付けをスケーリングする場合は、重み付けベクトルを掛けます: たとえば、c(1, .6, .3, 0, .3, .6, 1)

dmat <- matrix(sample(20, 20*7, repl=TRUE), 20, 7)
dfrm <- as.data.frame(dmat)

dfrm$wt <- sapply( dfrm[ c(2,5,1,4,6,3,7)] , rank); dfrm
 dfrm$wt[,1:3]  <- rep(NROW(dfrm),3) - dfrm$wt[ , 1:3] 
 dfrm$wt <- dfrm$wt*rep(c(1, .6, .3,  0, .3, .6, 1), each=NROW(dfrm))
 dfrm[ order( apply( dfrm$wt, 1, FUN=sum), decreasing=TRUE ) , ]

複数の基準を暗示しているため、これは V2 の最小値を最初にすることを強制しません。これがあなたが想像したものと正確に一致しない場合でも、再重み付けすることができます。

于 2013-01-11T02:37:50.977 に答える
0

このような:

dat <- as.matrix(df)
rnk <- t(apply(dat, 1, rank))
desiredRank <- order(c(2,5,1,4,6,3,7))
rnk.match <- rnk == matrix(desiredRank, nrow(rnk), ncol(rnk), byrow = TRUE)
match.score <- apply(rnk.match, 1, match, x = FALSE) - 1
match.score[is.na(match.score)] <- ncol(dat)
out <- dat[order(match.score, decreasing = TRUE), ]

head(out)
#            X1         X2        X3        X4        X5       X6        X7
#[1,] 0.7740246 0.19692680 1.5665696 0.9623104 0.2882492 1.367786 1.8644204
#[2,] 0.5895921 0.00498982 1.7143083 1.2698382 0.1776051 2.494149 1.4216615
#[3,] 0.1981111 0.11379934 1.0379619 0.2130251 0.1660568 1.227547 0.9248101
#[4,] 0.7507257 0.23353923 1.6502192 1.2232615 0.7497352 2.032547 1.4409475
#[5,] 0.5418513 0.06987903 1.8882399 0.6923557 0.3681018 2.172043 1.2215323
#[6,] 0.1731943 0.01088604 0.6878847 0.2450998 0.0125614 1.197478 0.3087192

この例では、最初の行がランク シーケンス全体に一致します。次の行は、シーケンスの最初の 5 つのランクに一致します。

head(match.score[order(match.score, decreasing = TRUE)])
# [1] 7 5 5 5 5 5
于 2013-01-11T03:05:41.600 に答える