更改变量值 - 重复的ID

时间:2015-08-11 19:45:40

标签: r

我有这个数据集

id <- c(0,0,1,1,2,2,3,3,4,4)
gender <- c("m","m","f","f","f","f","m","m","m","m")
x1 <-c(1,1,1,1,2,2,3,3,10,10)
x2 <- c(3,7,5,6,9,15,10,15,12,20)

alldata <- data.frame(id,gender,x1,x2)

看起来像:

id  gender  x1  x2

0   m   1   3
0   m   1   7
1   f   1   5
1   f   1   6
2   f   2   9
2   f   2   15
3   m   3   10
3   m   3   15
4   m   10  12
4   m   10  20

请注意,对于每个唯一ID x1是相似的,但x2是不同的。我需要按id和x2(从最小到最大)对数据进行排序 然后对于每个唯一的ID我需要设置x1(对于第二个记录)= x2(对于第一个记录)。

数据如下:

id  gender  x1  x2

0   m   1   3
0   m   3   7
1   f   1   5
1   f   5   6
2   f   2   9
2   f   9   15
3   m   3   10
3   m   10  15
4   m   10  12
4   m   12  20

4 个答案:

答案 0 :(得分:4)

我发现使用data.table

更容易
> library(data.table)
> dt = data.table(alldata)
> setkey(dt, id, x2)    #sort the data

下一行说:在x1的每个ID中,取x1的第一个值,然后根据需要从x2获取每个剩余值。

> dt[,x1 := c(x1[1], x2)[1:.N],keyby=id] 
> dt
    id gender x1 x2
 1:  0      m  1  3
 2:  0      m  3  7
 3:  1      f  1  5
 4:  1      f  5  6
 5:  2      f  2  9
 6:  2      f  9 15
 7:  3      m  3 10
 8:  3      m 10 15
 9:  4      m 10 12
10:  4      m 12 20

答案 1 :(得分:2)

这是一个dplyr解决方案。

library(dplyr) 
arrange(alldata,id,x2) %>%
  group_by(id) %>%
  mutate(x1= c(first(x1), first(x2)))

Source: local data frame [10 x 4]
Groups: id

   id gender x1 x2
1   0      m  1  3
2   0      m  3  7
3   1      f  1  5
4   1      f  5  6
5   2      f  2  9
6   2      f  9 15
7   3      m  3 10
8   3      m 10 15
9   4      m 10 12
10  4      m 12 20

答案 2 :(得分:2)

这是使用seq命令选择所有其他记录的另一种可能的解决方案:

alldata <- alldata[order(id, x2),]
alldata$x1[seq(2, length(alldata$x1), 2)] <- alldata$x2[seq(1, length(alldata$x2) - 1, 2)]

答案 3 :(得分:1)

`rownames<-`(do.call(rbind,by(alldata,alldata$id,function(g) { o <- order(g$x2); g$x1[o[2]] <- g$x2[o[1]]; g; })),NULL);
##    id gender x1 x2
## 1   0      m  1  3
## 2   0      m  3  7
## 3   1      f  1  5
## 4   1      f  5  6
## 5   2      f  2  9
## 6   2      f  9 15
## 7   3      m  3 10
## 8   3      m 10 15
## 9   4      m 10 12
## 10  4      m 12 20