2013-02-12 50 views
1

我有一些數據,看起來像這樣:部分匹配data.frame和子集中的所有data.frame

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 

我想過濾每一列「條件」中的數據。根據截斷幀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 

我敢肯定,可能有前發佈另一個類似的情況,但我搜索,我沒有發現它。

+0

如果要是條件在條件1滿足,而不是CONDITION2 ...例如List4過濾?你會爲所有情況拿走4號線嗎?我沒看到列情境2 ..這是一個類型錯誤? – agstudy 2013-02-12 15:17:45

+0

哦,對不起,我犯了一個錯誤!我編輯! – Fuv8 2013-02-12 15:22:24

+0

爲什麼List4在輸出列表中?條件2有0.56,這是> 0.5。 – prabhasp 2013-02-12 15:24:39

回答

1

可以使用的概念,即布爾檢查矢量:

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

和一些grep結果:

grep('Condition', names(DF1)) 

要做這個子集NG可以使用apply生成您的布爾向量:

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

和其子集:

DF1[keepers,] 

注意,這不一定返回的數據結構,你在你的問題顯示。但是您可以使用all或不同的閾值相應地更改匿名函數。


代替編輯,我會以不同的方式處理。我會用meltreshape2包:

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把數據傳回在最初的格式,如果你想要的,但我覺得在這個「長」表單數據更容易的工作。這種形式也是令人愉快的,因爲它避免了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 
+0

嗨賈斯汀!感謝您的幫助!不過在粘貼之後:out.c < - dcast(out,List_name〜condition,value.var ='cond.val')和out.s < - dcast(out,List_name〜situation,value .var ='situ.val')會出現:「缺少聚合函數:默認爲長度」。這是什麼意思?重塑對我來說是全新的。 – Fuv8 2013-02-12 16:41:34

+0

這意味着這兩個命令中的一個具有重複的行('List_name'和'condition'的組合)。 – Justin 2013-02-12 16:54:50

+0

嗨,賈斯汀!它工作得很好!我認爲reshape2是一個非常強大的圖書館!非常感謝你的幫助! – Fuv8 2013-02-13 17:15:34

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) 
+0

agstudy,對不起......最後的編輯會幫助你理解。對不起再次進行多次編輯。 – Fuv8 2013-02-12 15:55:33

+0

@ Fuv8你可以看到我的編輯。 – agstudy 2013-02-12 16:25:25

+0

嗨agstudy!非常感謝您的幫助! – Fuv8 2013-02-13 17:13:59

1

我想你問的是可以實現的,但它不可能是bind(綁定)你已經證明他們有不平等的元素的方式。所以,你會得到一個列表。

在這裏,我假設你的data.frame總是形式List_name,其次是Condition1,...,ConditionN,然後Situation1,...,SituationN

然後,這可以通過獲取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