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

Ste*_*ner 2 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
Run Code Online (Sandbox Code Playgroud)

这就是我想要的:

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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Psi*_*dom 7

你可以使用dplyr::group_indices():

NSE版本

group_indices(df, x, y)
# [1] 1 1 2 3 4 4
Run Code Online (Sandbox Code Playgroud)

SE版本

group_indices_(df, .dots = names(df))
# [1] 1 1 2 3 4 4
Run Code Online (Sandbox Code Playgroud)

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

df$pattern <- group_indices(df, x, y)
Run Code Online (Sandbox Code Playgroud)

从链接的答案看来,即使非标准评估版本不起作用mutate,标准评估版本也可以:

df %>% mutate(pattern = group_indices_(df, .dots = c('x', 'y')))
Run Code Online (Sandbox Code Playgroud)


jer*_*ycg 5

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

as.numeric(as.factor(paste(df$x,'_',df$y)))
Run Code Online (Sandbox Code Playgroud)

对于上面的数据,它是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
Run Code Online (Sandbox Code Playgroud)

  • @sirallen; `as.numeric(factor(do.call(paste,d)))` (3认同)