按条件在其他列中提供唯一的组ID

时间:2017-11-14 09:39:45

标签: r interaction

我想将这些行分组,在新列group ID中为它们提供唯一的group。如果RNAClassV1类似且diff小于10000,则应为行提供相同的ID。例如,具有rRNA和chr1的所有行和差异< 10000给出ID1。

我使用interaction

transform(input, group_ID = as.numeric(interaction(RNAClass, V1, drop=TRUE)))

输入:

   RNAClass    V1       diff
21     rRNA  chr8        122
33     rRNA  chr1       1140
45     rRNA  chr1       1313
68     rRNA  chr8       2222
72     tRNA  chr9       9207
80     tRNA  chr9       5111
72     tRNA  chr9     492407
80     tRNA  chr9      54111

输出:

   RNAClass    V1       diff    group
21     rRNA  chr8        122    ID1
33     rRNA  chr1       1140    ID2
45     rRNA  chr1       1313    ID2
68     rRNA  chr8       2222    ID1
72     tRNA  chr9       9207    ID3
80     tRNA  chr9       5111    ID3
72     tRNA  chr9     492407    ID4
80     tRNA  chr9       5111    ID3

1 个答案:

答案 0 :(得分:0)

base R选项是基于'diff'列创建逻辑索引'i1',paste''RNAClass'和'V1'('str1'),更改'str1'中的元素基于'i1',使其成为唯一的字符串。将“str1”转换为factor,将levels指定为unique值为'str1',强制转换为integer,将paste转换为'ID'

i1 <- input$diff >= 10000
str1 <- with(input, paste(RNAClass, V1))
str1[i1] <- paste0(str1[i1], seq_len(sum(i1)))
input$group <- paste0("ID", as.integer(factor(str1, levels = unique(str1))))
input$group
#[1] "ID1" "ID2" "ID2" "ID1" "ID3" "ID3" "ID4" "ID3"

或使用dplyr

library(dplyr)
input %>%
  mutate(group = paste0(RNAClass, V1,  as.integer(diff> 10000)),
         group = paste0("ID", as.integer(factor(group, levels = unique(group)))))

注意:'diff'中显示的最后一个元素被视为'5111'而不是'54111'