更改因子的值

时间:2016-12-19 14:35:54

标签: r

vec <- c("AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG", "HHH")
    x <- data.frame(id = rep(1:4, each = 6),
                    abbr = c(rep(vec[1:2], each = 3), rep(vec[3:4], each = 3), 
                                  rep(vec[5:6], each = 3), rep(vec[7:8], each = 3)))

所以:

x  id abbr
1   1  AAA
2   1  AAA
3   1  AAA
4   1  BBB
5   1  BBB
6   1  BBB
7   2  CCC
8   2  CCC
9   2  CCC
10  2  DDD
11  2  DDD
12  2  DDD
13  3  EEE
14  3  EEE
15  3  EEE
16  3  FFF
17  3  FFF
18  3  FFF
19  4  GGG
20  4  GGG
21  4  GGG
22  4  HHH
23  4  HHH
24  4  HHH

现在,我想为每个ID将abbr的第一个值更改为“a”,将第二个值abbr更改为“b”。

期望的结果应该是这样的。

   id   abbr
1   1    a
2   1    a
3   1    a
4   1    b
5   1    b
6   1    b
7   2    a
8   2    a
9   2    a
10  2    b
11  2    b
12  2    b
13  3    a
14  3    a
15  3    a
16  3    b
17  3    b
18  3    b
19  4    a
20  4    a
21  4    a
22  4    b
23  4    b
24  4    b

每个id的长度将随每个id中每个abbr的长度而变化。我可以肯定的是,每个id中只有两个abbr值。

我试图用for循环解决这个问题,我遍历每个唯一的id,但我的努力甚至不值得在这里显示:)

3 个答案:

答案 0 :(得分:2)

通过dplyr

完成此操作的一种方法
library(dplyr)
x %>% 
 group_by(id) %>% 
 mutate(abbr = factor(abbr, labels = c('a', 'b')))

答案 1 :(得分:0)

在基础R中,以下split-apply-combine将起作用:

do.call(rbind,lapply(split(x,x$id),function(x){x$abbr <- factor(x$abbr,labels=c("a","b"));x}))

分几行:

split_x <- split(x,x$id)
apply_x <- lapply(split_x,function(x){
                  x$abbr <- factor(x$abbr,labels=c("a","b"));
                  x})
do.call(rbind,apply_x)
#     id abbr
#1.1   1    a
#1.2   1    a
#1.3   1    a
#1.4   1    b
#1.5   1    b
#1.6   1    b
#2.7   2    a
#2.8   2    a
#2.9   2    a
#2.10  2    b
#2.11  2    b
#2.12  2    b
#3.13  3    a
#3.14  3    a
#3.15  3    a
#3.16  3    b
#3.17  3    b
#3.18  3    b
#4.19  4    a
#4.20  4    a
#4.21  4    a
#4.22  4    b
#4.23  4    b
#4.24  4    b

答案 2 :(得分:0)

以下基本R方法使用模数转换基础值,然后将这些值提供给factor。这适用于您的示例,并且适用于每个组ID都有两个因子级别的情况,以便按组ID排序因子级别。

x$abbr <- factor(2-(as.integer(x$abbr) %% 2), labels=c("a", "b"))
x
   id abbr
1   1    a
2   1    a
3   1    a
4   1    b
5   1    b
6   1    b
7   2    a
8   2    a
9   2    a
10  2    b
11  2    b
12  2    b
13  3    a
14  3    a
15  3    a
16  3    b
17  3    b
18  3    b
19  4    a
20  4    a
21  4    a
22  4    b
23  4    b
24  4    b
相关问题