如何根据列名称中的特定字符串分隔数据框

时间:2019-03-22 22:13:26

标签: r

我有一个庞大的数据,无法将其分为两组

const

基本上,我想根据列名的最后一个字符拆分数据。例如,如果您查看上述数据,第二列就是3C_AALI_01A,我想根据 _01A

生成两个数据集

因此,那些具有01到09值的列,我希望它们在一个数据帧中,而那些具有10到任意数字的列,它们希望它们在第二个数据帧中。例如在上面的示例数据中。

具有以下名称的列应在一个数据框中

    df<- structure(list(name = structure(1:3, .Label = c("a", "b", "c"
), class = "factor"), X3C_AALI_01A = c(651L, 2L, 1877L), X3C_AALJ_01B = c(419L, 
2L, 1825L), X3C_AALK_01A = c(1310L, 52L, 1286L), X4H_AAAK_11B = c(2978L, 
4L, 1389L), X5L_AAT0_01B = c(2576L, 15L, 1441L), X5L_AAT1_01A = c(2886L, 
5L, 921L), X5T_A9QA_03A = c(929L, 3L, 935L), A1_A0SI_10A = c(1578L, 
1L, 2217L), A1_A0SK_07C = c(3003L, 6L, 2984L), A1_A0SO_01A = c(6413L, 
0L, 3577L), A1_A0SP_05B = c(5157L, 5L, 4596L), A2_A04P_01A = c(4283L, 
6L, 2508L), X5L_AAh1_10A = c(2886L, 5L, 921L), X5T_A0QA_03A = c(929L, 
3L, 935L), A1_A0Sm_10A = c(1578L, 1L, 2217L), A1_ArSK_01A = c(3003L, 
6L, 2984L), A1_AfSO_01A = c(6413L, 0L, 3577L), A1_AuSP_05A = c(5157L, 
5L, 4596L), A2_Ap4P_11A = c(4283L, 6L, 2508L)), class = "data.frame", row.names = c(NA, 
-3L))

并且具有以下名称的列应位于另一个数据框中

3C_AALI_01A
3C_AALJ_01B
3C_AALK_01A
5L_AAT0_01B
5L_AAT1_01A
5T_A9QA_03A
A1_A0SK_07C
A1_A0SO_01A
A1_A0SP_05B
A2_A04P_01A
5T_A0QA_03A
A1_ArSK_01A
A1_AfSO_01A
A1_AuSP_05A

2 个答案:

答案 0 :(得分:1)

df1 <- df[,grep('0[1-9].$',colnames(df))]
df2 <- df[,-grep('0[1-9].$',colnames(df))]

答案 1 :(得分:0)

您可以使用tidyr::separate(..., last=-1)方法

  • 使用负字符串索引,这是您真正想要的
  • 此外,您的数据帧已转置,通常只有一个带有名称的列name和数字列a, b, c会更正常。就像t(df),没有不必要的强制字符串。