如何针对 R 中数据框中的不同日期对数据进行不同的标准化?
How do I standardize data differently for different dates in my dataframe in R?
首先 - 感谢您花时间 view/answer 我的问题。我会尽力解释这个问题(希望不会太难,我绝不是R专家)
假设我有以下数据(第一列是日期,第二列是 "levels",级别是每天从 2:8 开始的重复序列。Var 3 只是一些统计..)
Date level var3
1 2/10/2017 2 0.2340
2 2/10/2017 3 0.1240
3 2/10/2017 4 0.5120
4 2/10/2017 5 0.4440
5 2/10/2017 6 0.1200
6 2/10/2017 7 0.5213
7 2/10/2017 8 0.1200
8 2/11/2017 2 0.4100
9 2/11/2017 3 0.6500
10 2/11/2017 4 0.2400
11 2/11/2017 5 0.5500
13 2/11/2017 6 0.3100
14 2/11/2017 7 0.1500
15 2/11/2017 8 0.2300
16 2/12/2017 2 0.1500
17 2/12/2017 3 0.5800
18 2/12/2017 4 0.3300
19 2/12/2017 5 0.2100
20 2/12/2017 6 0.9800
21 2/12/2017 7 0.3200
22 2/12/2017 8 0.1800
我的目标是通过执行以下操作来标准化数据:
- Create a new column called 'Change'
- For each unique date, Change is (log(var3) - log(var3[level == 5])
本质上,对于每个唯一日期,我想按行获取 Var3 数据,然后将其对数减去当天 var3 的第 5 级值* [例如,change[1] = log (.2340) - log(.4440) .. change[2] = log(.1240) - log(.444)... 但对于 change[10] 它将是 log(.2400) - log(. 5500)..等等..
我在 R 中编写此代码时遇到问题,下面是我想出的代码(但结果似乎是 21 行 x 24 变量...但我真的只想要 21 行和 4 列,第 4 个是 "CHANGE"... 我就是听不懂:/ )
log_mean <- function(data_set) {
for (i in unique(data_set$Date) {
midpoint <- data_set$var3[data_set$level == 5]
c <- (log(data_set$var3) - log(midpoint))
change <- rbind(change,c)}}
y <- cbind(x, change)
如果可以请帮忙,直觉上这似乎很容易做到,我不确定如何在 R 中做到这一点 [是的,我是相对较新的]..
非常感谢!
试试这个:
library(dplyr)
df %>% group_by(Date) %>% mutate(change = log(var3) - log(var3[level==5]))
# A tibble: 21 x 4
# Groups: Date [3]
Date level var3 change
<fct> <int> <dbl> <dbl>
1 2/10/2017 2 0.234 -0.641
2 2/10/2017 3 0.124 -1.28
3 2/10/2017 4 0.512 0.143
4 2/10/2017 5 0.444 0
5 2/10/2017 6 0.12 -1.31
6 2/10/2017 7 0.521 0.161
7 2/10/2017 8 0.12 -1.31
8 2/11/2017 2 0.41 -0.294
9 2/11/2017 3 0.65 0.167
10 2/11/2017 4 0.24 -0.829
# ... with 11 more rows
总的来说,这属于 split-apply-combine
类别。 Google 术语并熟悉 R 为您提供的选项(例如 base, dplyr, data.table
)。以后会派上用场的。
首先 - 感谢您花时间 view/answer 我的问题。我会尽力解释这个问题(希望不会太难,我绝不是R专家)
假设我有以下数据(第一列是日期,第二列是 "levels",级别是每天从 2:8 开始的重复序列。Var 3 只是一些统计..)
Date level var3
1 2/10/2017 2 0.2340
2 2/10/2017 3 0.1240
3 2/10/2017 4 0.5120
4 2/10/2017 5 0.4440
5 2/10/2017 6 0.1200
6 2/10/2017 7 0.5213
7 2/10/2017 8 0.1200
8 2/11/2017 2 0.4100
9 2/11/2017 3 0.6500
10 2/11/2017 4 0.2400
11 2/11/2017 5 0.5500
13 2/11/2017 6 0.3100
14 2/11/2017 7 0.1500
15 2/11/2017 8 0.2300
16 2/12/2017 2 0.1500
17 2/12/2017 3 0.5800
18 2/12/2017 4 0.3300
19 2/12/2017 5 0.2100
20 2/12/2017 6 0.9800
21 2/12/2017 7 0.3200
22 2/12/2017 8 0.1800
我的目标是通过执行以下操作来标准化数据:
- Create a new column called 'Change'
- For each unique date, Change is (log(var3) - log(var3[level == 5])
本质上,对于每个唯一日期,我想按行获取 Var3 数据,然后将其对数减去当天 var3 的第 5 级值* [例如,change[1] = log (.2340) - log(.4440) .. change[2] = log(.1240) - log(.444)... 但对于 change[10] 它将是 log(.2400) - log(. 5500)..等等..
我在 R 中编写此代码时遇到问题,下面是我想出的代码(但结果似乎是 21 行 x 24 变量...但我真的只想要 21 行和 4 列,第 4 个是 "CHANGE"... 我就是听不懂:/ )
log_mean <- function(data_set) {
for (i in unique(data_set$Date) {
midpoint <- data_set$var3[data_set$level == 5]
c <- (log(data_set$var3) - log(midpoint))
change <- rbind(change,c)}}
y <- cbind(x, change)
如果可以请帮忙,直觉上这似乎很容易做到,我不确定如何在 R 中做到这一点 [是的,我是相对较新的]..
非常感谢!
试试这个:
library(dplyr)
df %>% group_by(Date) %>% mutate(change = log(var3) - log(var3[level==5]))
# A tibble: 21 x 4
# Groups: Date [3]
Date level var3 change
<fct> <int> <dbl> <dbl>
1 2/10/2017 2 0.234 -0.641
2 2/10/2017 3 0.124 -1.28
3 2/10/2017 4 0.512 0.143
4 2/10/2017 5 0.444 0
5 2/10/2017 6 0.12 -1.31
6 2/10/2017 7 0.521 0.161
7 2/10/2017 8 0.12 -1.31
8 2/11/2017 2 0.41 -0.294
9 2/11/2017 3 0.65 0.167
10 2/11/2017 4 0.24 -0.829
# ... with 11 more rows
总的来说,这属于 split-apply-combine
类别。 Google 术语并熟悉 R 为您提供的选项(例如 base, dplyr, data.table
)。以后会派上用场的。