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