我有以下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))
答案 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))