我是R.的新手。我有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 documentation,endsWith()
函数必须包含字符,而不是数据框。然而,我想在我的数据框架上使用它 - 或类似的东西 - 来对它进行子集化。最好的方法是什么?有没有办法强制数据框到角色?我是否需要使用循环来遍历数据框?
答案 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对其进行分组。分组有点不清楚但你可以修改findInterval的第二个参数来调整::
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::endsWith
比dplyr::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