按复杂条件对数据帧进行子集化

时间:2014-12-09 15:25:20

标签: r dataframe

我想请一位R专家写一个简洁的代码来从数据帧中对两个数据帧进行子集化。我的数据框df如下所示:

 mi     chr    bin   A       B       C       D     sum  QS
m004775 Ch01    1   FALSE   TRUE    FALSE   FALSE   1   NA
m004776 Ch01    1   FALSE   TRUE    FALSE   FALSE   1   NA
m027081 Ch01    4   FALSE   TRUE    FALSE   TRUE    2   1
m027082 Ch01    4   FALSE   TRUE    FALSE   FALSE   1   NA
m025498 Ch01    4   FALSE   TRUE    FALSE   TRUE    2   1
m025500 Ch01    6   FALSE   TRUE    TRUE    TRUE    3   1
m027084 Ch01    6   FALSE   FALSE   TRUE    TRUE    2   NA
m027088 Ch01    6   FALSE   TRUE    TRUE    TRUE    3   2
m004820 Ch01    6   TRUE    FALSE   FALSE   FALSE   1   NA
m004827 Ch01    7   FALSE   TRUE    FALSE   FALSE   1   NA
m004828 Ch01    7   FALSE   TRUE    FALSE   FALSE   1   1
m004830 Ch01    7   FALSE   FALSE   TRUE    TRUE    2   NA
m004859 Ch01    7   TRUE    TRUE    FALSE   FALSE   2   NA
m025511 Ch01    9   TRUE    TRUE    FALSE   FALSE   2   1
m004946 Ch01    9   TRUE    TRUE    FALSE   FALSE   2   NA
m004947 Ch01    9   FALSE   TRUE    FALSE   FALSE   1   NA
m027141 Ch01    9   TRUE    FALSE   TRUE    TRUE    3   1
m027156 Ch01    9   TRUE    TRUE    TRUE    FALSE   3   NA
m027163 Ch01    9   TRUE    FALSE   FALSE   FALSE   1   NA
m027165 Ch01    9   TRUE    TRUE    TRUE    FALSE   3   2
m027200 Ch01    10  TRUE    TRUE    TRUE    FALSE   3   NA
m005105 Ch01    10  TRUE    TRUE    TRUE    TRUE    4   1

预期的子集数据框df1

 mi     chr    bin  A       B       C       D      sum  QS
m027081 Ch01    4   FALSE   TRUE    FALSE   TRUE    2   1
m025500 Ch01    6   FALSE   TRUE    TRUE    TRUE    3   1
m004828 Ch01    7   FALSE   TRUE    FALSE   FALSE   1   1
m027141 Ch01    9   TRUE    FALSE   TRUE    TRUE    3   1
m027165 Ch01    9   TRUE    TRUE    TRUE    FALSE   3   2
m005105 Ch01    10  TRUE    TRUE    TRUE    TRUE    4   1

预期的子集数据框df2

 mi     chr    bin  A       B       C       D      sum  QS
m004775 Ch01    1   FALSE   TRUE    FALSE   FALSE   1   NA
m004820 Ch01    6   TRUE    FALSE   FALSE   FALSE   1   NA
m004830 Ch01    7   FALSE   FALSE   TRUE    TRUE    2   NA
m004859 Ch01    7   TRUE    TRUE    FALSE   FALSE   2   NA

子集的行必须符合以下规则: 对于每个组的每个bin(列bin:level 1, 2, 3, …,20)(列chr1:levels ch01, ch02, …,ch20):

  1. 如果列ABCD具有TRUE值,请选择尽可能少的行{{}列TRUEABC中的{1}} {列中的D值的数量为列{{1} });
  2. 如果列TRUE中的值是数字(值:sumQS1,则选择的优先顺序为:2> 3> 1);所选行转到2;
  3. 如果列3中的值为df1,则遵循与规则1相同的规则,所选行将转到QS,如果bin已选择行对于相应的列NAdf2ABC中没有对此广告单元的选择。
  4. 我手动完成了这个选择。首先,按列D对数据框进行排序,以分隔数字和df2,然后按QSNAchr(递减顺序)对数字块进行排序, bin(递增顺序),然​​后为每个bin选择最顶层的一个。如果选中sumQS的行,则会完成这些分页,如果选择了4sum3的行,我需要查找其他可以选择同一个bin中的行。然后移至2块以执行类似的选择,但是如果相同列中的行包含相应列1NAAB {在数字块中选择了{1}}值,C块中没有选择。 使用大数据帧太复杂和耗时。如果有人可以帮助我使用R代码,那将节省我很多时间。谢谢你的帮助。

0 个答案:

没有答案