我有一个数据框
>id=c(1,2,1,1,2);type=c("B","S","S","B","B")
>temp=data.frame(id, type)
id type
1 1 B
2 2 S
3 1 S
4 1 B
5 2 B
所以类型有两个级别:B和S.对于每一行,如果id == 2,我想切换级别并让它的id = 1,并得到这样的结果:
id type
1 1 B
2 1 B
3 1 S
4 1 B
5 1 S
我试过编码:
>for (i in 1:nrow(temp)) {
if (temp[i,1]==2)
{if (temp[i,2]=="B") temp[i,2]=="S"
else temp[i,2]=="B";temp[i,1]=1;} }
但它没有用。它返回了这个:
id type
1 1 B
2 1 S
3 1 S
4 1 B
5 1 B
temp [i,1]已经改变但是temp [i,2]保持不变。我该如何解决?有没有更简单的方法来做到这一点因为我的代码看起来很笨拙?提前致谢。 -Natalia
答案 0 :(得分:1)
我认为这会奏效。虽然,也许有一种更简单的方法。
id=c(1,2,1,1,2); type=c("B","S","S","B","B")
temp=data.frame(id, type, stringsAsFactors = FALSE)
temp$type2 <- ifelse(temp$type == 'B', 'S', 'B')
temp
# id type type2
#1 1 B S
#2 2 S B
#3 1 S B
#4 1 B S
#5 2 B S
temp2 <- temp[,1:2]
temp2$type <- ifelse(temp$id == 2, temp$type2, temp$type)
temp2$id <- 1
temp2
# id type
#1 1 B
#2 1 B
#3 1 S
#4 1 B
#5 1 S