按组创建索引

时间:2019-08-08 11:24:54

标签: r

一个简单的问题,但似乎找不到答案。

我正在尝试将第一个单元格中的所有单元格分开。

V1=c(4,5,6,3,2,7)
V2= c(2,4,5,8,7,9)
group=c(1,1,1,2,2,2)

D= data.frame(V1=V1, V2=V2, group=group)

D
  V1 V2 group
1  4  2     1
2  5  4     1
3  6  5     1
4  3  8     2
5  2  7     2
6  7  9     2

这就是我想要得到的:

    V1  V2  group
1   1.0 1.0 1
2   1.3 2.0 1
3   1.5 2.5 1
4   1.0 1.0 2
5   0.7 0.9 2
6   2.3 1.1 2

5 个答案:

答案 0 :(得分:1)

一个dplyr选项:

D %>%
  group_by(group) %>%
  mutate_at(c("V1", "V2"), ~./first(.))
# A tibble: 6 x 3
# Groups:   group [2]
     V1    V2 group
  <dbl> <dbl> <dbl>
1 1     1         1
2 1.25  2         1
3 1.5   2.5       1
4 1     1         2
5 0.667 0.875     2
6 2.33  1.12      2

答案 1 :(得分:1)

这是一种单线基础R解决方案,

D[-3] <- sapply(D[-3], function(i) ave(i, D$group, FUN = function(i)i / i[1]))

D
#         V1    V2 group
#1 1.0000000 1.000     1
#2 1.2500000 2.000     1
#3 1.5000000 2.500     1
#4 1.0000000 1.000     2
#5 0.6666667 0.875     2
#6 2.3333333 1.125     2

答案 2 :(得分:0)

一种dplyr方式:

library(dplyr)

D %>%
  group_by(group) %>%
  mutate_all(~ round(. / first(.), 1))

一种data.table方法:

library(data.table)

setDT(D)[, lapply(.SD, function(x) round(x / x[1], 1)), by = group]

答案 3 :(得分:0)

基本的R解决方案:

split(D, D$group) <- lapply(split(D, D$group), 
                            function(.) {
                               .[,1:2] <- as.data.frame(t(t(.[, 1:2]) / unlist(.[1,1:2])))
                               .
                            })
D
#          V1    V2 group
# 1 1.0000000 1.000     1
# 2 1.2500000 2.000     1
# 3 1.5000000 2.500     1
# 4 1.0000000 1.000     2
# 5 0.6666667 0.875     2
# 6 2.3333333 1.125     2

答案 4 :(得分:0)

带有max.block.ms

的选项
base R