一个简单的问题,但似乎找不到答案。
我正在尝试将第一个单元格中的所有单元格分开。
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
答案 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