1

タイトルで言ったように、私の目的は、別のデータフレームの情報を使用して、データフレームのサブセットの間隔を抽出することです。

私の入力:

df1:

  subject         x      y
7G001-0024-10   0,00    15
7G001-0024-10   97,29   18
7G001-0024-10   197,34  21
7G001-0024-10   314,66  22
7G001-0024-10   482,77  25
7G001-0030-10   0,00    12
7G001-0030-10   99,50   16
7G001-0030-10   184,37  20
7G001-0030-10   301,89  25
7G001-0030-10   585,67  27
     ...         ...   ...

df2:

    subject   Threshold 
7G001-0024-10   177,08
7G001-0030-10   385,13
    ...          ...

各被験者について、df1 で 0 と各被験者のしきい値の間の x および y データを抽出し、この精神で出力を取得するために df2 に含めたいと思います。

  subject         x      y
7G001-0024-10   0,00    15
7G001-0024-10   97,29   18
7G001-0030-10   0,00    12
7G001-0030-10   99,50   16
7G001-0030-10   184,37  20
7G001-0030-10   301,89  25
    ...          ...   ...

私の最初のアイデアは、ddply 関数内で which() を使用することでした:

break=ddply(df1,.(subject),summarize,fun=x[which(x>=0 & x<Threshold )])

しかし、私は立ち往生しています。どの関数内でしきい値(df2)の変更を示す方法がわかりませんでした。

ええと、誰かがそれをどのように処理するかを教えてくれたら(私の最初の直感でかどうか)

下手な英語でごめんなさい。

4

1 に答える 1

3

まず、あなたのデータ:

df1 <- read.table(text = "subject         x      y
7G001-0024-10   0,00    15
7G001-0024-10   97,29   18
7G001-0024-10   197,34  21
7G001-0024-10   314,66  22
7G001-0024-10   482,77  25
7G001-0030-10   0,00    12
7G001-0030-10   99,50   16
7G001-0030-10   184,37  20
7G001-0030-10   301,89  25
7G001-0030-10   585,67  27", header = TRUE, dec = ",")

df2 <- read.table(text = "subject   Threshold 
7G001-0024-10   177,08
7G001-0030-10   385,13", header = TRUE, dec = ",")

simpleapplyを使用してタスクを解決できます。

do.call("rbind", apply(df2, 1, FUN = function(a) {df1[a[1] == df1$subject & df1$x >= 0 & df1$x <= as.numeric(a[2]), ]}))

#         subject      x  y
# 1 7G001-0024-10   0.00 15
# 2 7G001-0024-10  97.29 18
# 6 7G001-0030-10   0.00 12
# 7 7G001-0030-10  99.50 16
# 8 7G001-0030-10 184.37 20
# 9 7G001-0030-10 301.89 25

それはどのように機能しますか?

まず、関数apply(df2, 1, FUN)はデータ フレームの各行に関数を適用しますdf2。この値1は、関数がオブジェクトの 1 番目の次元に適用されることを意味します (2 番目の次元は列になります)。

簡単な関数を見てください。の 1 行目と 2 行目を返すだけですdf2。出力では、行が列として配置されていることに注意してください。

> apply(df2, 1, FUN = function(a) a)
          [,1]            [,2]           
subject   "7G001-0024-10" "7G001-0030-10"
Threshold "177.08"        "385.13"   

df1より複雑な関数のサブセットを抽出したいので必要です。だから、私は指定しました:

FUN = function(a) {df1[a[1] == df1$subject & df1$x >= 0 & df1$x <= as.numeric(a[2]), ]}

この関数でaは、データ フレームの行を表しますdf2。この関数は、 の両方の行に対して 1 回、合計 2 回適用されますdf2a[1]は件名、a[2]は対応するしきい値です。df1この関数は、次の3 つの基準によってデータ フレームの行のサブセットを抽出します。

  1. 件名が同じです ( a[1] == df1$subject)
  2. x値はゼロ以上です( df1$x >= 0)
  3. x値がしきい値を超えていません( df1$x <= as.numeric(a[2]))

注: 値a[2]は によって数値に変換する必要がありますas.numeric。のサブジェクト ID はdf2文字として表されapply、行全体 (しきい値を含む) が文字に変換されるため、これが必要です。

これらの各基準は論理ベクトルを返します。これらのベクトルは&、3 つの基準がすべて満たされているかどうかを示す単一の論理ベクトルに結合されます。論理ベクトルがある場所のすべてdf1[logical.vector, ]の行が選択されています。の後に何も指定されていないため、すべての列が選択されます。df1TRUE,

df13 つの基準がすべて満たされている行がapply関数によって返されます。

> apply(df2, 1, FUN = function(a) {df1[a[1] == df1$subject & df1$x >= 0 & df1$x <= as.numeric(a[2]), ]})
[[1]]
        subject     x  y
1 7G001-0024-10  0.00 15
2 7G001-0024-10 97.29 18

[[2]]
        subject      x  y
6 7G001-0030-10   0.00 12
7 7G001-0030-10  99.50 16
8 7G001-0030-10 184.37 20
9 7G001-0030-10 301.89 25

この関数applyは、 の各行に 1 つずつ、2 つのデータ フレームのリストを返しますdf2

最後のステップで、リスト内のデータ フレームが 1 つのデータ フレームに結合されます。関数は関数do.call("rbind", list)を実行rbindし、リスト内の引数を関数に渡します。長さ 2 のリストの場合、これは と同等rbind(list[[1]], list[[2]])です。このようにして、 によって返されたリスト内の両方のデータ フレームapplyが結合されます。

于 2012-09-06T07:46:00.223 に答える