将两列中的整数替换为连续的自然数

Replace integers with consecutive natural numbers in two columns

我在 Mac (x86_64-apple-darwin13.4.0)

上使用 R 版本 3.1.2

我有 40 个文件,每个文件有 5 列,如下所示。

> D16S503
MARKER    LANE           ID A_1 A_2
1  D16S503 D16S503 1228-0198898 309 313
2  D16S503 D16S503 1228-0198899 301 311
3  D16S503 D16S503 1228-0198900 301 311
4  D16S503 D16S503 1228-0198901 301 311
5  D16S503 D16S503 1228-0198903 311 313
6  D16S503 D16S503 1228-0198904 301 301
7  D16S503 D16S503 1228-0198905 301 301
8  D16S503 D16S503 1228-0198906 301 313
9  D16S503 D16S503 1228-0198907 301 311
10 D16S503 D16S503 1228-0198908 301 313
11 D16S503 D16S503 1228-0198909 301 311
12 D16S503 D16S503 1228-0198910 301 301
13 D16S503 D16S503 1228-0198911 301 307
14 D16S503 D16S503 1228-0198912 301 301
15 D16S503 D16S503 1228-0198913 301 311
16 D16S503 D16S503 1228-0198914 301 311
17 D16S503 D16S503 1228-0198915 311 311
18 D16S503 D16S503 1228-0198916 301 311
19 D16S503 D16S503 1228-0198917 311 313
20 D16S503 D16S503 1228-0198918 301 301
21 D16S503 D16S503 1228-0198919 301 313
22 D16S503 D16S503 1228-0198920 301 311
23 D16S503 D16S503 1228-0198921 305 311
24 D16S503 D16S503 1228-0198922 311 311
25 D16S503 D16S503 1228-0198923 307 311
26 D16S503 D16S503 1228-0198924 301 311

首先,我在最后两列中识别出唯一的整数。

> sort(unique(c(D16S503$A_1,D16S503$A_2)))
[1] 301 305 307 309 311 313

然后我希望用从 1 开始递增的连续自然数替换 D16S503$A_1 和 D16S503$A_2 列中的整数。 即用 1 替换 301,用 2 替换 305,用 3 替换 307,等等

这是我想要的数据框

> D16S503
MARKER    LANE           ID A_1 A_2
1  D16S503 D16S503 1228-0198898 4 6
2  D16S503 D16S503 1228-0198899 1 5
3  D16S503 D16S503 1228-0198900 1 5
4  D16S503 D16S503 1228-0198901 1 5
5  D16S503 D16S503 1228-0198903 5 6
6  D16S503 D16S503 1228-0198904 1 1
7  D16S503 D16S503 1228-0198905 1 1
8  D16S503 D16S503 1228-0198906 1 6
9  D16S503 D16S503 1228-0198907 1 5
10 D16S503 D16S503 1228-0198908 1 6
11 D16S503 D16S503 1228-0198909 1 5
12 D16S503 D16S503 1228-0198910 1 1
13 D16S503 D16S503 1228-0198911 1 3
14 D16S503 D16S503 1228-0198912 1 1
15 D16S503 D16S503 1228-0198913 1 5
16 D16S503 D16S503 1228-0198914 1 5
17 D16S503 D16S503 1228-0198915 5 5
18 D16S503 D16S503 1228-0198916 1 5
19 D16S503 D16S503 1228-0198917 5 6
20 D16S503 D16S503 1228-0198918 1 1
21 D16S503 D16S503 1228-0198919 1 6
22 D16S503 D16S503 1228-0198920 1 5
23 D16S503 D16S503 1228-0198921 2 5
24 D16S503 D16S503 1228-0198922 5 5
25 D16S503 D16S503 1228-0198923 3 5
26 D16S503 D16S503 1228-0198924 1 5

我的文件都在 A_1 和 A_2 列中包含不同的整数,并且包含 2 到 10 个之间的任意整数。

我怎样才能做到这一点?我很乐意一个一个地处理每个文件,但我知道 R 函数会更快并且出错的机会更少。

R 中,您可以通过指定 "levels" 将所需的列("A_1"、"A_2")转换为 "factor" class作为这些列 ("lvls") 中已排序的串联唯一元素,然后将其强制返回到 "numeric".

lvls <- sort(unique(c(D16S503$A_1,D16S503$A_2)))
D16S503[4:5] <- lapply(D16S503[4:5], function(x)
          as.numeric(factor(x, levels=lvls)))

head(D16S503,3)
#   MARKER    LANE           ID A_1 A_2
#1 D16S503 D16S503 1228-0198898   4   6
#2 D16S503 D16S503 1228-0198899   1   5
#3 D16S503 D16S503 1228-0198900   1   5