1

次のようなデータがあります。

 List_name     Condition1   Condition2  Situation1   Situation2
  List1          0.01         0.12         66           123
  List2          0.23         0.22         45           -34
  List3          0.32         0.23         13           -12
  List4          0.03         0.56         -3            45
  List5          0.56         0.05         12           100
  List6          0.90         0.09         22            32

data.frameの各列「Condition」をカットオフ0.5に従ってフィルタリングしたいと思います。フィルタの後、サブセットが発生し、「状況」列の対応する値を保持します。フィルタとサブセットはペアで機能します。「Condition1」と「Situation1」、「Condition2」と「Situation2」などです。

ちょうど望ましい出力:

 List_name     Condition1     Situation1  List_name  Condition2  Situation2
  List1          0.01             66       List1        0.12        123
  List2          0.23             45       List2        0.22        -34
  List3          0.32             13       List3        0.23        -12
  List4          0.03             -3       List5        0.05        100
                                           List6        0.09         32

以前に同様の状況が投稿された可能性があると確信していますが、検索しても見つかりませんでした。

4

3 に答える 3

2

優れた@Arunソリューションに似ていますが、列名に基づいており、仮定はありません。

cols.conds <- colnames(dat)[gregexpr(pattern='Condition[0-9]+',colnames(dat)) > 0]
lapply(cols.conds, function(x){
   col.list <- colnames(dat)[1]
   col.situ <- gsub('Condition','Situation',x)
   dat[which(dat[[x]] < 0.5), c(col.list,x,col.situ)]}
)

私はdatが:であると仮定します

dat <- read.table(text =' List_name     Condition1   Condition2  Situation1   Situation2
  List1          0.01         0.12         66           123
  List2          0.23         0.22         45           -34
  List3          0.32         0.23         13           -12
  List4          0.03         0.56         -3            45
  List5          0.56         0.05         12           100
  List6          0.90         0.02         22            32',head=T)
于 2013-02-12T15:29:49.433 に答える
1

ブールチェックがベクトル化されるという概念を使用できます。

x <- c(0.1, 0.3, 0.5, 0.2)
x < 0.5
# [1]  TRUE  TRUE FALSE  TRUE

そしていくつかのgrep結果:

grep('Condition', names(DF1))

このサブセット化を行うapplyには、ブールベクトルを生成するために使用できます。

keepers <- apply(DF1[, grep('Condition', names(DF1))], 1, function(x) any(x < 0.5))

そしてサブセット:

DF1[keepers,]

これは、質問で示したデータ構造を必ずしも返すわけではないことに注意してください。allただし、または別のしきい値を使用して、それに応じて無名関数を変更できます。


編集の代わりに、私はこれに別の方法でアプローチします。私はパッケージmeltから使用します:reshape2

library(reshape2)
dat.c <- melt(DF1, 
              id.var='List_name', 
              measure.var=grep('Condition', names(DF1), value=TRUE),
              variable.name='condition',
              value.name='cond.val')
dat.c$idx <- gsub('Condition', '', dat.c$condition)
dat.s <- melt(DF1, 
              id.var='List_name', 
              measure.var=grep('Situation', names(DF1), value=TRUE),
              variable.name='situation',
              value.name='situ.val')
dat.s$idx <- gsub('Situation', '', dat.s$situation)
dat <- merge(dat.c, dat.s)

out <- dat[dat$cond.val < 0.5,]

   List_name idx  condition cond.val  situation situ.val
1      List1   1 Condition1     0.01 Situation1       66
2      List1   2 Condition2     0.12 Situation2      123
3      List2   1 Condition1     0.23 Situation1       45
4      List2   2 Condition2     0.22 Situation2      -34
5      List3   1 Condition1     0.32 Situation1       13
6      List3   2 Condition2     0.23 Situation2      -12
7      List4   1 Condition1     0.03 Situation1       -3
10     List5   2 Condition2     0.05 Situation2      100
12     List6   2 Condition2     0.09 Situation2       32

その後、必要に応じてデータを初期形式に戻すために使用できますがdcast、この「長い」形式のデータははるかに扱いやすいと思います。この形式は、1つの条件が満たされ、他の条件が満たされない行がある場合にNA値が不要になるため、快適です。

out.c <- dcast(out, List_name ~ condition, value.var='cond.val')
out.s <- dcast(out, List_name ~ situation, value.var='situ.val')
merge(out.c, out.s)

  List_name Condition1 Condition2 Situation1 Situation2
1     List1       0.01       0.12         66        123
2     List2       0.23       0.22         45        -34
3     List3       0.32       0.23         13        -12
4     List4       0.03         NA         -3         NA
5     List5         NA       0.05         NA        100
6     List6         NA       0.09         NA         32
于 2013-02-12T15:31:08.220 に答える
1

あなたが求めていることは達成可能だと思いますがbind、それらは等しくない要素を持っているので、あなたが示したようにそれを(束縛する)ことはできません。だから、あなたはリストを取得します。

ここでは、あなたdata.frameは常に、の形式であり、その後に、...、、そして、 ...、List_nameのリストが続くと仮定します。Condition1ConditionNSituation1SituationN

次に、これは、最初に取得してから、idsを使用してフィルタリングすることで取得できます。lapply

ids <- grep("Condition", names(df))
lapply(ids, function(x) df[which(df[[x]] < 0.5), c(1,x,x+length(ids))])

# [[1]]
#   List_name Condition1 Situation1
# 1     List1       0.01         66
# 2     List2       0.23         45
# 3     List3       0.32         13
# 4     List4       0.03         -3
# 
# [[2]]
#   List_name Condition2 Situation2
# 1     List1       0.12        123
# 2     List2       0.22        -34
# 3     List3       0.23        -12
# 5     List5       0.05        100
# 6     List6       0.09         32
于 2013-02-12T16:10:47.687 に答える