列值位移保持模式

时间:2018-06-28 06:49:37

标签: r shift

我有以下df(有很多列)。如何强制所有值都从1开始,并保持每个ID的模式?示例:

 input <- data.frame(ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3),
  Obs1 = c(1,1,1,2,2,4,4,5,6,7,2,3,4,4),
  Obs2 = c(2,2,3,4,5,1,1,1,1,1,1,1,2,2),
  Obs3 = c(5,6,7,8,9,3,3,3,4,4,1,1,2,2))

所需结果

result <- data.frame(ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3),
  Obs1 = c(1,1,1,2,2,1,1,2,3,4,1,2,3,3),
  Obs2 = c(1,1,2,3,4,1,1,1,1,1,1,1,2,2),
  Obs3 = c(1,2,3,4,5,1,1,1,2,2,1,1,2,2))

2 个答案:

答案 0 :(得分:1)

我们可以先按“ ID”分组,然后按match的所有其他列的值及其unique的值

library(dplyr)
result <- input %>% 
             group_by(ID) %>%
             mutate_all(funs(match(., unique(.))))

all.equal(result, result1, check.attributes = FALSE)
#[1] TRUE

答案 1 :(得分:1)

按ID分组,然后减去每个组中每一列的最小值(负1):

library(dplyr)

input %>%
    group_by(ID) %>%
    mutate_at(vars(Obs1, Obs2, Obs3), funs(. - min(.) + 1))