335

1つまたは2つのレベルのデータフレームにネストされたベクトルがあるとします。関数を使用せずに最後の値にアクセスするための迅速で汚い方法はありlength()ますか?何かアラPERLの$#特別な変数?

だから私は次のようなものが欲しいです:

dat$vec1$vec2[$#]

それ以外の

dat$vec1$vec2[length(dat$vec1$vec2)]
4

11 に答える 11

449

私はtail関数を使用します:

tail(vector, n=1)

の良いところは、イディオムtailとは異なり、データフレームでも機能することです。x[length(x)]

于 2008-09-17T13:32:45.113 に答える
133

Python の x[-1] 表記のような優れたものを探しているなら、運が悪いと思います。標準的なイディオムは

x[length(x)]  

しかし、これを行う関数を書くのは簡単です:

last <- function(x) { return( x[length(x)] ) }

R に欠けているこの機能も私を悩ませています。

于 2008-09-17T13:27:17.140 に答える
52

リンデロフグレッグ・リンドのアイデアを組み合わせる:

last <- function(x) { tail(x, n = 1) }

n=プロンプトで作業する場合、通常は省略しますtail(x, 1)

lastfrompastecsパッケージとは異なり、 headand tail(from utils) はベクトルだけでなくデータ フレームなどでも機能し、「最初/最後の n 要素なし」のデータを返すこともできます。

but.last <- function(x) { head(x, n = -1) }

head(の代わりにこれを使用する必要があることに注意してくださいtail。)

于 2008-09-30T16:28:14.767 に答える
19

次のコードを使用して、663,552 行のデータ フレームでこれら 2 つのアプローチをベンチマークしました。

system.time(
  resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
    s <- strsplit(x, ".", fixed=TRUE)[[1]]
    s[length(s)]
  })
  )

 user  system elapsed 
  3.722   0.000   3.594 

system.time(
  resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
    s <- strsplit(x, ".", fixed=TRUE)[[1]]
    tail(s, n=1)
  })
  )

   user  system elapsed 
 28.174   0.000  27.662 

したがって、ベクトルで作業していると仮定すると、長さの位置へのアクセスは大幅に高速になります。

于 2014-05-13T18:20:29.347 に答える