R 用两列中的连续自然数替换整数

R 用两列中的连续自然数替换整数,r,macos,replace,unique,R,Macos,Replace,Unique,我在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 D16S5

我在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列中的整数。 i、 e.将301替换为1305,将2307替换为3,以此类推

这是我想要的数据帧

> 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
中,您可以将所需的列(“A_1”、“A_2”)转换为“factor”类,方法是将“levels”指定为这些列(“LVL”)中排序的串联唯一元素,然后强制将其转换回“numeric”


lvls哪种语言/平台?你应该添加一个标签列出它。已经更新谢谢你工作得很好!非常感谢你。
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