15

applydata.frame で使用する場合、引数は (暗黙的に) 文字に変換されます。例:

df <- data.frame(v=1:10, t=1:10)
df <- transform(df, t2 = as.POSIXlt(t, origin = "2013-08-13"))
class(df$t2[1])
## [1] "POSIXct" "POSIXt" (correct)

しかし:

 apply(df, 1, function(y) class(y["t2"]))
 ## [1] "character" "character" "character" "character" "character" "character"
 ## [7] "character" "character" "character" "character"

この変換を回避する方法はありますか? または、常に元に戻す必要がありas.POSIXlt(y["t2"])ますか?

edit
私の df には 2 つのタイムスタンプ (t2 と t3 など) とその他のフィールド (v1、v2 など) があります。与えられた t2 の行ごとに、t3 が t2 に最も近いが t2 より低い (および同じ v1) を持つ k (たとえば 3) 行を見つけ、これらの行から v2 の統計 (たとえば平均) を返したいと考えています。関数 f(t2, v1, df) を作成し、 を使用してすべての行に適用したかっただけapply(df, 1, function(x) f(y["t2"], y["v1"], df)です。Rでそのようなことを行うより良い方法はありますか?

4

2 に答える 2

7

複数のコメントをまとめて説明しましょう。

  1. を使用すると、 aが aにapply変換されます。これは、最も制限の少ないクラスが使用されることを意味します。この場合の制限が最も少ないのは文字です。data.framematrix
  2. の引数1に指定しています。これは行ごとに適用され、クラスを実際に混在させているため、さらに悪化します。このシナリオでは、ベクトルの行列と data.frames 用に設計されています。これは、仕事に適したツールではありません。applyMARGINapply
  3. この場合、以下に示すように、lapplyまたはsapplyrmk が指摘するように、単一の t2 列のクラスを取得するために使用します。

コード:

df <- data.frame(v=1:10, t=1:10)
df <- transform(df, t2 = as.POSIXlt(t, origin = "2013-08-13"))

sapply(df[, "t2"], class)
lapply(df[, "t2"], class)

## [[1]]
## [1] "POSIXct" "POSIXt" 
## 
## [[2]]
## [1] "POSIXct" "POSIXt" 
## 
## [[3]]
## [1] "POSIXct" "POSIXt" 
## 
## .
## .
## . 
## 
## [[9]]
## [1] "POSIXct" "POSIXt" 
## 
## [[10]]
## [1] "POSIXct" "POSIXt" 

apply一般的に、仕事に合った家族を選択します。多くの場合、私は個人的にlapplyまたはforループを使用して、特定の列に作用するか、インデックスを使用して必要な列をサブセット化し ( [, ])、次に に進みますapply。この問題への答えは、あなたが達成したいことを決定することです。質問することがapply最も適切なツールであり、そこから先に進みます。

このブログ投稿applyを、さまざまな関数ファミリの機能に関する優れたチュートリアルとして提供できますか。

于 2013-08-13T16:47:59.857 に答える
1

試す:

sapply(df, function(y) class(y["t2"]))

$v
[1] "integer"

$t
[1] "integer"

$t2
[1] "POSIXct" "POSIXt"
于 2013-08-13T16:33:40.300 に答える