我有一个非常大的3列数据框,每列有大约5000个值。
示例:
/k
我想按照第三列中rs后面的数字以及第一列中Y(或BB)后面的数字对数据进行分组。
大约有40个rs号和300个Y号。
我曾尝试使用split()但是我在使用split后遇到的问题是难以操作拆分数据框中的列或行。比如在一列上使用table()。
我希望输出是第二列的表,按rs后面的数字分组:
2534 21M_BB143 G Cluster Results for rs1816072.csv
2535 24M_BB118 G Cluster Results for rs1816072.csv
2536 15N_BB148 G Cluster Results for rs1816072.csv
2537 19N_BB152 G Cluster Results for rs1816072.csv
2538 3O_Y208 G Cluster Results for rs1816072.csv
2539 4O_Y209 G Cluster Results for rs1816072.csv
2540 3P_Y224 G Cluster Results for rs1816072.csv
2541 6P_Y227 G Cluster Results for rs1816072.csv
2542 2E_Y084RE No Call Cluster Results for rs183961 REspots.csv
2543 4E_Y141RE T Cluster Results for rs183961 REspots.csv
2544 1F_Y181RE T Cluster Results for rs183961 REspots.csv
2545 1E_Y068RE TC Cluster Results for rs183961 REspots.csv
2546 3E_Y127RE TC Cluster Results for rs183961 REspots.csv
2547 5E_Y154RE TC Cluster Results for rs183961 REspots.csv
2548 6E_Y167RE C Cluster Results for rs183961 REspots.csv
答案 0 :(得分:1)
我为“' rs'之后的数字创建了一个新列。你喜欢分组。我们假设您的数据框名为df
,第二列和第三列的名称为second_col
和third_col
,并且数字后面的数字为' rs'从所有行中的相同位置开始:
library(stringr)
df$group_col <- str_sub(df$third_col, 23, 28)
现在,您可以使用您选择的分组功能(aggregate
,by
,plyr::ddply
,dplyr::group_by
+ dplyr::summarise
等。由于分组和值输入是向量,tapply
可能是合适的:
tapply(df$second_col, df$group_col, sum)
答案 1 :(得分:1)
df1 <- data.frame(
col1 = c("24M_BB118", "24M_BB118", "3O_Y208", "3O_Y208"),
col2 = c("G", "C", "G", "C"),
col3= c("Cluster Results for rs1816072.csv", "Cluster Results for rs1816072.csv", "Cluster Results for rs1816072.csv", "Cluster Results for rs1816072.csv")
)
df1
library(stringi)
col3_extracted <- stri_match_first_regex(df1$col3, "rs(\\d+)")[,1]
lapply(split(df1$col2, col3_extracted), table)
col1_extracted <- stri_match_first_regex(df1$col1, "(Y|BB)(\\d+)")[,1]
lapply(split(df1$col2, col1_extracted), table)
结果:
$rs1816072
C G
2 2
$BB118
C G
1 1
$Y208
C G
1 1
该解决方案使用正则表达式提取&#34; rs&#34;之后的数字或者BB或Y以及之后的数字。之后,我使用第1列或第3列的值拆分第2列。当我有第2列的值(第3列的值)时,我使用table
。