在r中按列操作数据

时间:2016-03-04 18:25:24

标签: r split

我有一个非常大的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

2 个答案:

答案 0 :(得分:1)

我为“' rs'之后的数字创建了一个新列。你喜欢分组。我们假设您的数据框名为df,第二列和第三列的名称为second_colthird_col,并且数字后面的数字为' rs'从所有行中的相同位置开始:

library(stringr)
df$group_col <- str_sub(df$third_col, 23, 28)

现在,您可以使用您选择的分组功能(aggregatebyplyr::ddplydplyr::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