将两列中的整数替换为连续的自然数
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
我在 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