在R中,选择一组行并筛选

在R中,选择一组行并筛选,r,select,rows,R,Select,Rows,我有一个数据框 D 我想从col1==2中选择col2==8和col2==19的行,同时从col1==5中选择col2==1和col2==19的行。换句话说,我想要一些像这样的 D 在我的另一个例子中,我有一个包含许多行的大数据集,我想选择许多col1组,并为每个组选择col2的顺序代码。 我也想要一些处理字符列的代码使用子集非常简单。只需要得到正确的比较嵌套 subset(D, (col1 == 2 & col2 %in% c(8,19)) | (col1 == 5 & col

我有一个数据框

D

我想从col1==2中选择col2==8和col2==19的行,同时从col1==5中选择col2==1和col2==19的行。换句话说,我想要一些像这样的

D

在我的另一个例子中,我有一个包含许多行的大数据集,我想选择许多col1组,并为每个组选择col2的顺序代码。
我也想要一些处理字符列的代码

使用子集非常简单。只需要得到正确的比较嵌套

subset(D, (col1 == 2 & col2 %in% c(8,19)) | (col1 == 5 & col2 %in% c(1, 19)) )

在这里,我们使用%in%一次检查多个值

我猜您确实希望在不一定位于相邻行的组中使用最小值和最大值对。如果我是对的,那么创建两个结果列比按照您建议的方式排列更有意义:

> aggregate(D['col2'], D['col1'], function(x) c(min=min(x), max=max(x) ) )
  col1 col2.min col2.max
1    1       15       16
2    2        8       19
3    5        1       19
4    7       15       15
有多种聚合函数。我试着让tapply和sapply以类似的方式行事,在这里你可以看到结果。我需要定义一个基于setNames的新函数来标记sapply返回的矩阵中的列:

当您得到tapply在上面重新计算的值时,有一个非常方便的do.call操作,可以将它们结合在一起:

val <-  tapply(D[,'col2'], D[,'col1'], function(x) c(min=min(x), max=max(x) ) )
> do.call(rbind, val)
  min max
1  15  16
2   8  19
5   1  19
7  15  15

请注意,分组值现在是行名,而不是列本身。

您自己尝试了什么?选择、子集、筛选等功能。。。但是我不知道合适的参数看看data.table包。这里有很多例子SO@mnel,我想知道对他来说什么是一个好的数据表解决方案。似乎他只想要两个容易做到的特定组,但他希望每个组有不同的规则,在这种情况下,这些规则将变得无关紧要
> aggregate(D['col2'], D['col1'], function(x) c(min=min(x), max=max(x) ) )
  col1 col2.min col2.max
1    1       15       16
2    2        8       19
3    5        1       19
4    7       15       15
setColNames <-  function (object = nm, nm) 
 { colnames(object) <- nm
    object
 }

> setColNames( sapply(unique(D[,'col1']), function(x) {z <- D[ D$col1 %in% x ,'col2'];  

c(min=min(z), max=max(z) ) }), unique(D[,'col1']) )
         2  5  7  1
    min  8  1 15 15
    max 19 19 15 16
> tapply(D[,'col2'], D[,'col1'], function(x) c(min=min(x), max=max(x) ) )
$`1`
min max 
 15  16 

$`2`
min max 
  8  19 

$`5`
min max 
  1  19 

$`7`
min max 
 15  15 
val <-  tapply(D[,'col2'], D[,'col1'], function(x) c(min=min(x), max=max(x) ) )
> do.call(rbind, val)
  min max
1  15  16
2   8  19
5   1  19
7  15  15