0

列の条件のリストに基づいてデータ フレームから項目を抽出できる手順があります ( (column_name = value) リストとして指定された基準を使用して R データ フレームから項目を抽出するを参照)。

データフレームと条件リストは次のとおりです。

> experimental_plan_1
  lib genotype treatment replicate
1   A       WT    normal         1
2   B       WT       hot         1
3   C      mut    normal         1
4   D      mut       hot         1
5   E       WT    normal         2
6   F       WT       hot         2
7   G      mut    normal         2
8   H      mut       hot         2
> condition_1 <- list(genotype="WT", treatment="normal")

lib私の目標は、リストで指定された基準に対応する行の列の値を抽出することです。

次の関数を使用して、必要な値を抽出できます。

> get_libs <- function(experimental_plan, condition) {experimental_plan[apply((experimental_plan[, names(condition)] == condition), 1, all), "lib"]}

これは、上記のデータ フレームでうまく機能します。

> get_libs(experimental_plan_1, condition_1)
[1] A E
Levels: A B C D E F G H

ただし、これをより一般的にしたいと思います: Myexperimental_plancondition異なる列を持つことができます:

> experimental_plan_2
  lib genotype replicate
1   A       WT         1
2   B       WT         2
3   C       WT         3
4   D      mut         1
5   E      mut         2
6   F      mut         3
> condition_2 <- list(genotype="WT")

今回は失敗します:

> get_libs(experimental_plan_2, condition_2)
Error in apply((experimental_plan[, names(condition)] == condition), 1,  : 
  dim(X) must have a positive length

この場合、予想される出力は次のようになります。

[1] A B C
Levels: A B C D E F

より堅牢な方法で同じことを実行する関数を作成するにはどうすればよいですか?


コメント

両方のケースが非常に似ているにもかかわらず、関数が機能しないことは非常にイライラします。両方のデータフレームにlib列があり、両方のケースで条件リストの名前がデータフレームの列名に対応しています。

R は、データ フレームから抽出された列の数が 1 に減ると、明らかに自動的に data.frame を factor に変換します。

> class(experimental_plan_1)
[1] "data.frame"
> class(experimental_plan_2)
[1] "data.frame"
> class(names(condition_1))
[1] "character"
> class(names(condition_2))
[1] "character"
> class(experimental_plan_1[, names(condition_1)])
[1] "data.frame"
> class(experimental_plan_2[, names(condition_2)])
[1] "factor"

これは最小の驚きの原則に反します。同じタイプの入力が与えられた場合、計算は同じタイプの出力を返すと思います。

4

0 に答える 0