根据因素访问data.frame的值

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

从像这样的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)以及相应的因素。还必须保留“时间”列。

我希望我的问题很清楚,我会感激你的每一个帮助。

r dataframe
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.