まず、あなたのデータ:
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 回適用されますdf2。a[1]は件名、a[2]は対応するしきい値です。df1この関数は、次の3 つの基準によってデータ フレームの行のサブセットを抽出します。
- 件名が同じです (
a[1] == df1$subject)
x値はゼロ以上です( df1$x >= 0)
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が結合されます。