部分匹配data.frame和子集所有data.frame

时间:2013-02-12 14:51:51

标签: r

我有一些看起来像这样的数据:

 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过滤data.frame的每个列“Condition”。 在过滤器之后,子集将出现并将携带“情境”列的相应值。过滤器和子集将成对工作:“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

我很确定之前可能会发布其他类似的情况,但我搜索过,但我没有找到它。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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将数据放回初始格式,但我发现这种“长”形式的数据更容易使用。这种形式也很令人愉快,因为它避免了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

答案 2 :(得分:1)

我认为你所要求的是可以实现的,但它不能以你所显示的方式bind(约束),因为它们具有不相等的元素。所以,你会得到一个清单。

在此,我假设您的data.frame始终采用List_name形式,后跟Condition1,...,ConditionN以及{{1}的列表},...,Situation1

然后,可以先获取SituationN,然后使用ids过滤

来获取此信息
lapply