列值位移保持模式

问题描述 投票:1回答:2

我有以下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))
r shift
2个回答
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
投票

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

library(dplyr)

input %>%
    group_by(ID) %>%
    mutate_at(vars(Obs1, Obs2, Obs3), funs(. - min(.) + 1))
© www.soinside.com 2019 - 2024. All rights reserved.