从这样的data.frame开始
df<-NULL
Time<-c(1,1,1,2,2,3)
Fac<-c("a","b","c","a","b","c")
Val<-c(1,4,6,7,8,43)
df<-data.frame(Time,Fac,Val)
Time Fac Val
1 a 2
1 b 4
1 c 6
2 a 7
2 b 8
3 c 43
我想根据“ Fac”中的因素归一化“ Val”的每个值。
例如对于因子a:我想将“ Val”中的每个值除以因子“ a”谷2。对于因子“ b”中“ Val”中的每个值均除以因子“ b”谷4。
我尝试使用
by(df,df$Fac,FUN=function(x)x["Val"]/x[["Val"]][1])
这将创建具有归一化值的因子列表。但这导致了如何再次合并列表的问题,因为这些因素可能是不规则的(例如,a,b,c,a,b,a,b,c,c,a,b),而其中的相应因素“时间”列也必须保留。
我希望我的问题很清楚,希望能对您有所帮助。
答案 0 :(得分:0)
使用dplyr
的解决方案。我假设您正在通过将每个组的第一个值相除来进行归一化。如果要通过将每个组的最小值除以标准化,请将first(Val)
更改为min(Val)
。
library(dplyr)
dat2 <- dat %>%
group_by(Fac) %>%
mutate(Val = Val/first(Val)) %>%
ungroup()
dat2
# # A tibble: 6 x 3
# Time Fac Val
# <dbl> <fct> <dbl>
# 1 1 a 1
# 2 1 b 1
# 3 1 c 1
# 4 2 a 7
# 5 2 b 2
# 6 3 c 7.17
编码样式建议:
df<-NULL
不是必需的,我们可以忽略它。另外,df
是R中的函数名称,因此最好使用另一个名称。
示例数据创建:
Time<- c(1,1,1,2,2,3)
Fac <- c("a","b","c","a","b","c")
Val <- c(1,4,6,7,8,43)
dat <- data.frame(Time,Fac,Val)