关于 r:根据因素访问 data.frame 的值

Accessing values of a data.frame depending on factors

从像这样的 data.frame 开始

1
2
3
4
5
6
7
8
9
10
11
12
13
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.

我试过用

1
by(df,df$Fac,FUN=function(x)x["Val"]/x[["Val"]][1])

这将创建具有归一化值的因子列表。但这导致了如何再次组合列表的问题,因为因子可能是不规则的(例如a,b,c,a,b,a,b,c,c,a,b)和相应的因子在"Time" 列也必须保留。

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


使用 dplyr 的解决方案。我假设您通过从每个组中划分第一个值来进行标准化。如果您通过从每个组中除以最小值进行归一化,请将 first(Val) 更改为 min(Val).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 中的函数名,所以最好使用另一个名称。

示例数据创建:

1
2
3
4
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)