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,但我的努力甚至不值得在这里显示:)
答案 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