基于字符结束的数据框子集

时间:2018-03-26 21:55:43

标签: r regex dataframe subset

我是R.的新手。我有data.frame。开头和结尾分别如下:

Beginning of data frame End of data frame

我想要做的是根据“条形码”列的最后一位数对这个数据框进行子集化。数字从1到16,因此有16组。我想将这16个分为5组。例如,所有以“1”和“2”结尾的条形码将是数据帧的一个子集,所有以“3”,“4”和“5”结尾的条形码将进入另一个子集,依此类推。

我使用which()endsWith()函数尝试了此操作:

my_frame = data.frame()
character_one = as.character(1)
subset_by_group_one <- my_frame[which(endsWith(my_frame, character_one)),]

但是,我收到以下错误:

Error in endsWith(barcode_subset, character_one) : non-character object(s)

似乎基于R documentationendsWith()函数必须包含字符,而不是数据框。然而,我想在我的数据框架上使用它 - 或类似的东西 - 来对它进行子集化。最好的方法是什么?有没有办法强制数据框到角色?我是否需要使用循环来遍历数据框?

4 个答案:

答案 0 :(得分:3)

您希望根据正则表达式模式对行进行子集化(以“16”结尾,即"16$"。我认为最直接的方法是使用对于这些行为true的逻辑向量以grepl(pattern, x)生成逻辑向量,其中x是具有您感兴趣的值的列。然后通过在行位置使用该逻辑索引向量按行进行子集化。子集表达式my_frame[<index vector>,]。看看下面是如何模拟数据的。drop设置为FALSE,以防rownames实际上是行名而不是​​另一列(而你没有另一列)列)。

my_frame[grepl("16$", my_frame$barcode),, drop = FALSE]
#                               barcode other
# GACCTAAATGCCTGT-16 GACCTAAATGCCTGT-16  blah
# GAAATTGACATGACT-16 GAAATTGACATGACT-16  blah

数据:

barcode <- replicate(32, {
  paste(sample(c("T", "A", "C", "G"), 15, replace = TRUE), collapse = "")
})
barcode <- paste0(barcode, "-", 1:16)
my_frame <- data.frame(row.names = barcode, barcode = barcode, other = rep("blah", 32), stringsAsFactors = FALSE)
head(my_frame)
#                             barcode other
# GTCCGGTGATGATAA-1 GTCCGGTGATGATAA-1  blah
# CTGCTACATATAGAA-2 CTGCTACATATAGAA-2  blah
# GTGACCGTGGTCGAA-3 GTGACCGTGGTCGAA-3  blah
# TCTAGGACGATTACT-4 TCTAGGACGATTACT-4  blah
# GAGGGAGGCGTCCAT-5 GAGGGAGGCGTCCAT-5  blah
# CAGCAGCCTCCACCG-6 CAGCAGCCTCCACCG-6  blah

答案 1 :(得分:3)

我正在使用Dan Hall的例子。这构建了一个分裂/分组向量&#34;通过删除包括破折号在内的所有材料,将其转换为数字,然后使用findInterval对其进行分组。分组有点不清楚但你可以修改find​​Interval的第二个参数来调整::

 grp <- findInterval( as.numeric( gsub("^.+[-]", "", my_frame$barcode)), 
                       c(.5, 2.5, 5.5, 8.5, 12.5, 16.5)) #split boundaries
> split( my_frame, grp)
$`1`
                            barcode other
TCGCGCGTTACATGT-1 TCGCGCGTTACATGT-1  blah
GCGTGTTATCCGCCT-2 GCGTGTTATCCGCCT-2  blah
CTCCCTCTTCTGTGC-1 CTCCCTCTTCTGTGC-1  blah
TTCTTGTGCGACAAA-2 TTCTTGTGCGACAAA-2  blah

$`2`
                            barcode other
CTTACGTCGTCAGCA-3 CTTACGTCGTCAGCA-3  blah
CCCATGTGTGACTAC-4 CCCATGTGTGACTAC-4  blah
GAGCCCAGAACTGTG-5 GAGCCCAGAACTGTG-5  blah
GTTGGCGAGCAGCAT-3 GTTGGCGAGCAGCAT-3  blah
ATTTAGGGGACCCAA-4 ATTTAGGGGACCCAA-4  blah
TGGCCAATGCGTTGA-5 TGGCCAATGCGTTGA-5  blah

$`3`
                            barcode other
TCCGTCCGGGGAGGA-6 TCCGTCCGGGGAGGA-6  blah
TTCAAATCGTCTACT-7 TTCAAATCGTCTACT-7  blah
AGGTACAATCTCGCA-8 AGGTACAATCTCGCA-8  blah
CGTGACTCCAATGGT-6 CGTGACTCCAATGGT-6  blah
CCGGGGGGTTGCCCC-7 CCGGGGGGTTGCCCC-7  blah
CTTTAAGTGTGTCAG-8 CTTTAAGTGTGTCAG-8  blah

$`4`
                              barcode other
TGCTGACAGTTAGAG-9   TGCTGACAGTTAGAG-9  blah
GGAAGGTGCAGAGGC-10 GGAAGGTGCAGAGGC-10  blah
AATTTAGGGCGGCCT-11 AATTTAGGGCGGCCT-11  blah
CCATCATGCGGGACG-12 CCATCATGCGGGACG-12  blah
TCCGAATCTGAGCAA-9   TCCGAATCTGAGCAA-9  blah
TCCCACCCTTTCTCG-10 TCCCACCCTTTCTCG-10  blah
CTCCTGGTCGCCACA-11 CTCCTGGTCGCCACA-11  blah
TCCCGCAACATGTAC-12 TCCCGCAACATGTAC-12  blah

$`5`
                              barcode other
TAAGAGTGCCAGTCC-13 TAAGAGTGCCAGTCC-13  blah
ACTCCACTGCCCAAC-14 ACTCCACTGCCCAAC-14  blah
CACCGTGGGTGCACA-15 CACCGTGGGTGCACA-15  blah
TGGGTGTCTGTCATG-16 TGGGTGTCTGTCATG-16  blah
CTGACATTGGTACAC-13 CTGACATTGGTACAC-13  blah
GCGCAGGTTCGAACC-14 GCGCAGGTTCGAACC-14  blah
TTTTTTCCCCCGACC-15 TTTTTTCCCCCGACC-15  blah
CCCAGCTGCCATTGA-16 CCCAGCTGCCATTGA-16  blah

答案 2 :(得分:1)

实际上,您所寻找的功能是base::endsWith。它返回一个布尔值向量,并将变量作为第一个参数。

df2 <- df1[endsWith(df1$z,"2"),]
#    z whatev
# 1 x2   blah
# 3 l2   blah
# 4 y2   blah
# 5 o2   blah
# 8 v2   blah

dplyr::ends_with基本上是在dplyr调用中使用的,尤其是select,尽管我们可以通过小心参数顺序使其工作。它会返回数值但在这种情况下它没有区别。

library(dplyr)    
df2 <- df1[ends_with("2",vars=df1$z),]
#     z whatev
# 1  v2   blah
# 3  s2   blah
# 8  j2   blah
# 9  n2   blah
# 10 z2   blah

数据

set.seed(1)
df1 <- data.frame(z = paste0(sample(letters,10),sample(1:3,10,T)),whatev="blah",stringsAsFactors=F)
#     z whatev
# 1  v2   blah
# 2  q3   blah
# 3  s2   blah
# 4  m1   blah
# 5  l1   blah
# 6  y1   blah
# 7  a1   blah
# 8  j2   blah
# 9  n2   blah
# 10 z2   blah

具有讽刺意味的是,base::endsWithdplyr::filter更适合dplyr::ends_with次来电。

答案 3 :(得分:1)

我使用正则表达式提取结尾,然后加入包含组信息的数据框。

一些示例数据:

library(tidyverse)
df1 <- data.frame(x = paste0("AAA-", 1:16))

一些示例组:1-2 = 1; 3-5 = 2; 6-9 = 3; 10-14 = 4; 15-16 = 5。

加入df1

df1 %>% 
  mutate(suffix = str_match(x, "-(\\d+)$")[, 2] %>% as.numeric()) %>%
  left_join(data.frame(suffix = 1:16, 
                       group = c(1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5)))

        x suffix group
1   AAA-1      1     1
2   AAA-2      2     1
3   AAA-3      3     2
4   AAA-4      4     2
5   AAA-5      5     2
6   AAA-6      6     3
7   AAA-7      7     3
8   AAA-8      8     3
9   AAA-9      9     3
10 AAA-10     10     4
11 AAA-11     11     4
12 AAA-12     12     4
13 AAA-13     13     4
14 AAA-14     14     4
15 AAA-15     15     5
16 AAA-16     16     5