R:根据多个变量的值定义不同的模式

时间:2016-12-19 21:21:50

标签: r dplyr

以下是我所拥有的:

data.frame(x=c(0,0,0,1,1,1), y=c(0,0,1,0,1,1))

  x y
1 0 0
2 0 0
3 0 1
4 1 0
5 1 1
6 1 1

这就是我想要的:

data.frame(x=c(0,0,0,1,1,1), y=c(0,0,1,0,1,1), pattern=c(1,1,2,3,4,4))

  x y pattern
1 0 0       1
2 0 0       1
3 0 1       2
4 1 0       3
5 1 1       4
6 1 1       4

也就是说,我有一堆列(不仅仅是两列)和数千行。我想浏览每一行,弄清楚x,y,z等的不同组合是什么,将每一个称为不同的模式,并为每一行返回该模式。

(背景:我在很多时间点都有几个基因的基因表达数据。我想通过根据某些事物的上升或下调来定义模式,试着看看哪些基因随着时间的推移而相似地振荡在任何特定的时间点)。

感谢。

3 个答案:

答案 0 :(得分:7)

您可以使用dplyr::group_indices()

NSE版

group_indices(df, x, y)
# [1] 1 1 2 3 4 4

SE版

group_indices_(df, .dots = names(df))
# [1] 1 1 2 3 4 4

这个函数不幸的一面是它不能使用mutate函数(但是),所以你必须使用它:

df$pattern <- group_indices(df, x, y)

从链接的答案来看,即使非标准评估版本不能与mutate一起使用,标准评估版也会这样做:

df %>% mutate(pattern = group_indices_(df, .dots = c('x', 'y')))

答案 1 :(得分:5)

在base中我们可以将相关列粘贴在一起,将它们转换为字符,然后获取因子的整数代码:

as.numeric(as.factor(paste(df$x,'_',df$y)))

对于上面的数据,它是dplyr解决方案速度的一半(不清楚它将如何扩展):

microbenchmark::microbenchmark(as.numeric(as.factor(paste(z$x,'_',z$y))), group_indices(df, x, y))
Unit: microseconds
                                        expr     min       lq     mean  median       uq     max neval cld
 as.numeric(as.factor(paste(df$x, "_", df$y))) 150.913 153.9855 162.5637 159.745 165.8890 258.817   100  a 
                     group_indices(df, x, y) 322.945 327.3610 339.4574 337.922 340.4175 567.938   100   b

答案 2 :(得分:1)

在data.table中使用rleid。

log4j.logger.org.mybatis.example=DEBUG