1

私はRの初心者なので、「Rのやり方」で物事を考えるのに苦労しています...

私はこの機能を持っています:

upOneRow <- function(table, column) {
  for (i in 1:(nrow(table) - 1)) {
    table[i, column] = table [i + 1, column]
  }
  return(table)
}

それは十分に単純に見え、実行にそれほど時間がかからないはずですが、〜30万行のデータフレームでは、実行にかかる時間は不合理です. これにアプローチする正しい方法は何ですか?

4

3 に答える 3

7

ループの代わりに、次のようなことを試すことができます。

n <- nrow(table)
table[(1:(n-1)), column] <- table[(2:n), column];

ベクトル化が鍵

于 2012-05-21T13:59:43.127 に答える
3

簡単な答え: data.frame の列も、[,] でインデックス付けできるベクトルです。

my.table <- data.frame(x = 1:10, y=10:1)
> my.table
  x y
1 1 5
2 2 4
3 3 3
4 4 2
5 5 1
my.table$y <-c(my.table[-1,"y"],NA) #move up one spot and pad with NA
> my.table
  x  y
1 1  4
2 2  3
3 3  2
4 4  1
5 5 NA

これで、関数は最後に最後のデータ ポイントを繰り返します。これが本当に必要な場合は、NA の代わりに tail(x,1) をパディングします。

my.table$y <-c(my.table[-1,"y"],tail(my.table$y,1)) #pad with tail(x,1)
> my.table
  x y
1 1 4
2 2 3
3 3 2
4 4 1
5 5 1
于 2012-05-21T16:20:09.763 に答える
1

私があなたを正しく理解していれば、データフレームの1列を「上に移動」しようとしていて、最初の要素が一番下になります。次に、次のように達成される可能性があります。

col <- table[, column]
table[, column] <- col[c(nrow(table), 1:(nrow(table)-1))]
于 2012-05-21T16:01:45.970 に答える