まず、あなたのデータ:
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, ]
の行が選択されています。の後に何も指定されていないため、すべての列が選択されます。df1
TRUE
,
df1
3 つの基準がすべて満たされている行が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
が結合されます。