按R中的列以自然顺序排序

时间:2018-09-18 23:40:55

标签: r sorting join

我使用full.joint合并了两个表:

fsts = full_join(fstvarcal, fst, by = "SNP")

这具有以下效果:将两个数据集具有值的第一行分组,然后将仅第一数据集具有值(第二个NA包含)的行分组,然后将存在第二个数据集的行分组值仅适用于第二个数据集(而第一个NA则不适用)。

我正在尝试按自然顺序订购

在bash中寻找sort -V -k1的等效项。

我已经尝试过:

library(naturalsort);

fstordered = fsts[naturalorder(fsts$SNP),]

可以,但是非常慢。

有更快的方法吗?还是在不失去自然顺序的情况下合并两个数据集?

我有:

SNP fst
scaffold_0   0.186473
scaffold_9   0.186475
scaffold_10  0.186472
scaffold_11  0.186470
scaffold_99  0.186420
scaffold_100 0.186440

SNP fstvarcal
scaffold_0    0.186472
scaffold_8    0.186475
scaffold_20   0.186477
scaffold_21   0.186440
scaffold_999  0.186450
scaffold_1000 0.186420

和wan合并成

SNP fstvarcal fst
scaffold_0    0.186472 0.186473
scaffold_8    0.186475    NA
scaffold_9       NA    0.186475
scaffold_10      NA    0.186472
scaffold_11      NA    0.186470
scaffold_20   0.186477   NA    
scaffold_21   0.186440   NA    
scaffold_99      NA    0.186420
scaffold_100     NA    0.186440
scaffold_999  0.186450   NA    
scaffold_1000 0.186420   NA  

1 个答案:

答案 0 :(得分:0)

也许您可以执行以下操作:

我首先生成一些代表性的样本数据。

set.seed(2018)
df <- data.frame(
    SNP = sprintf("scaffold_%i", 1:1000),
    val = rnorm(1000))
df <- df[df$SNP, ]

我们现在使用tidyr::separateSNP分为"id""no",并用arrange"id""no"行分开以确保自然排序(convert = T自动将"no"转换为integer列向量)。

library(tidyverse)
df %>%
    separate(SNP, into = c("id", "no"), remove = F, convert = T) %>%
    arrange(id, no) %>%
    select(-id, -no)
#               SNP           val
#1       scaffold_1 -0.4229839834
#2       scaffold_2 -1.5498781617
#3       scaffold_3 -0.0644293189
#4       scaffold_4  0.2708813526
#5       scaffold_5  1.7352836655
#6       scaffold_6 -0.2647112113
#7       scaffold_7  2.0994707023
#8       scaffold_8  0.8633512196
#9       scaffold_9 -0.6105871453
#10     scaffold_10  0.6370556066
#11     scaffold_11 -0.6430346953
#...