如何有条件地选择data.frame中与多个因素匹配的所有元素

如何有条件地选择data.frame中与多个因素匹配的所有元素,r,dataframe,data.table,R,Dataframe,Data.table,我必须根据特定条件从数据帧中选择一组数据。数据框大致如下所示: F1 F2 D1 D2 1 A1 B1 1 0 2 A1 B1 1 1 3 A1 B1 0 0 4 A1 B2 1 0 5 A1 B2 0 0 6 A2 B2 1 0 7 A2 B2 1 1 Fx是因子,Dx是数据值。我要做的是: 查找数据值与特定模式匹配的行 对于与该模式匹配的每一行,查找具有相同因子的所有行 对于每个唯一的因子组合,对具有该组合的所有行应用一些操作 比如说, factors &l

我必须根据特定条件从数据帧中选择一组数据。数据框大致如下所示:

  F1 F2 D1 D2
1 A1 B1  1  0
2 A1 B1  1  1
3 A1 B1  0  0
4 A1 B2  1  0
5 A1 B2  0  0
6 A2 B2  1  0
7 A2 B2  1  1
Fx
是因子,
Dx
是数据值。我要做的是:

  • 查找数据值与特定模式匹配的行
  • 对于与该模式匹配的每一行,查找具有相同因子的所有行
  • 对于每个唯一的因子组合,对具有该组合的所有行应用一些操作
  • 比如说,

    factors <- unique(data[D1==1 & D2 == 1, c("F1","F2")])
    
    我越来越接近这个解决方案,但是使用上面的示例数据,这将选择所有行。但不应选择第4行和第5行,因为它们不完全匹配。如何添加某种条件,要求%in%匹配发生在同一行上

    我觉得这应该是一个普通的操作,因此R可能有一个聪明的方法来做这件事


    有什么想法吗????谢谢。

    感觉像是
    tapply
    paste
    的工作。。。例如,让我们将data2定义为与您的数据对象相同,但有一个“Val”列(您没有说您可能希望执行哪种行操作,所以这只是为了帮助说明)

    现在检查以下命令:

    tapply(data2$Val,paste(data2$F1,data2$F2,sep="~"),sum)
    
    您应该获得以下输出:

    A1~B1 A2~B1 
       26    43 
    
    应该清楚的是,R正在计算F1和F2的每个可能组合的Val之和(实际上,正如命令所示,它查看F1和F2的粘贴,这相当于相同的东西)。。。A1~B1的总和为26(7+19),A2~B1的总和为43(只有一行)。在tapply中将
    sum
    更改为
    length
    ,您将得到这样的行数,依此类推

    希望这有帮助……:)

    编辑:刚刚看到您的修改。如果只是在数据中的所有行之后,其中F1和F2的组合是因子对象中列出的F1和F2组合之一。。。您可以使用
    粘贴

    data[paste(data$F1,data$F2,sep="~") %in% paste(factors$F1,factors$F2,sep="~"),]
    
    sep=“~”
    不是严格需要的,只是习惯的力量。我想上面这行应该会给你你想要的行。如果要对具有特定F1/F2组合的行的每个子集执行函数,请使用tapply,如上所述:)


    为方便起见,data2的dput如下所示:

    structure(list(
    F1 = structure(c(1L, 1L, 2L), .Label = c("A1", "A2"), class = "factor"), 
    F2 = structure(c(1L, 1L, 1L), .Label = "B1", class = "factor"), 
    D1 = c(1L, 1L, 1L), D2 = c(1L, 0L, 1L), D3 = c(0L, 1L, 1L), 
    D4 = c(1L, 1L, 1L), Val = c(7, 19, 43)), 
    .Names = c("F1", "F2", "D1", "D2", "D3", "D4", "Val"), 
    row.names = c(NA, -3L), class = "data.frame")
    

    您可以使用
    data.table
    包的索引来选择所有需要操作的行

    data <- data.table(data,key="F1,F2")
    data[unique(data[D1 == 1 & D2 == 1,list(F1,F2)])]
    

    数据了解
    plyr
    软件包-这将使您的大部分分析变得非常简单。请首先查看我建议的解决方案的“编辑”部分。。。希望它能解决你的问题:)谢谢。这似乎是在复制我已经拥有的东西。但我还不知道如何从那里开始。我想data.table文档会对我有所帮助。谢谢,我想出来了。这似乎是最简单的解决办法。
    structure(list(
    F1 = structure(c(1L, 1L, 2L), .Label = c("A1", "A2"), class = "factor"), 
    F2 = structure(c(1L, 1L, 1L), .Label = "B1", class = "factor"), 
    D1 = c(1L, 1L, 1L), D2 = c(1L, 0L, 1L), D3 = c(0L, 1L, 1L), 
    D4 = c(1L, 1L, 1L), Val = c(7, 19, 43)), 
    .Names = c("F1", "F2", "D1", "D2", "D3", "D4", "Val"), 
    row.names = c(NA, -3L), class = "data.frame")
    
    data <- data.table(data,key="F1,F2")
    data[unique(data[D1 == 1 & D2 == 1,list(F1,F2)])]