Reputation: 2867
I have the following dataset.
structure(list(Monate = structure(c(5L, 4L, 9L, 1L, 8L, 7L, 6L,
2L, 12L, 11L, 10L, 3L), .Label = c("April", "August", "Dezember",
"Februar", "Januar", "Juli", "Juni", "Mai", "März", "November",
"Oktober", "September"), class = "factor"), `06:00:00-00:59:59` = c(1.23650890285152,
1, 0.941959539059369, 0.89618038635695, 0.839845976370379, 0.75789368475892,
0.745357979199247, 0.72726835342115, 0.852384444043199, 0.909567524854388,
0.927385464132519, 0.86987613403725), `06:00:00-08:59:59` = c(0.28594460357425,
0.28900629033325, 0.315719841587, 0.2955345904455, 0.273041491484,
0.26127195229025, 0.23431503049, 0.22167349349575, 0.2603577651915,
0.27084189072775, 0.2653932948955, 0.246001500902), `09:00:00-12:59:59` = c(0.48396300341875,
0.4767075864935, 0.46442852744125, 0.4497871047545, 0.4088477917855,
0.39907331646225, 0.387052062652, 0.3717692228805, 0.39248244105925,
0.422900151297, 0.4111808332435, 0.41687239709375), `13:00:00-16:59:59` = c(0.80304931519625,
0.7588016605465, 0.66548492801425, 0.6354014724685, 0.670969199053,
0.58076568424625, 0.67418744877975, 0.5756792489565, 0.66766765226025,
0.642654220031, 0.665735145053, 0.64571729495575), `17:00:00-19:59:59` = c(1.44101730420325,
1.35385679874675, 1.2576760885645, 1.1478274405785, 1.04871946565175,
0.96498516399125, 0.9775891903885, 0.9959819200865, 1.0805495717725,
1.2042836233065, 1.29337213775425, 1.17905118172475), `20:00:00-22:59:59` = c(2.7590124723295,
2.1458514208575, 2.00826846019375, 1.91719758837025, 1.7425652515095,
1.509920737758, 1.3851778869395, 1.43588733645025, 1.8753361739725,
2.03981388252275, 2.013661241837, 1.79544669375925), `23:00:00-00:59:59` = c(1.92548355216275,
0.926693335582, 0.921407232611, 0.92680356666725, 0.87033626954225,
0.81832375651025, 0.75033232500425, 0.7289554638715, 0.79565322269175,
0.85606802035675, 0.90891474021375, 0.94322847859325)), class = "data.frame", row.names = c(NA,
-12L))
I want to build index values where I set one month to "1".
saisonindex <- RWavg %>%
mutate(`06:00:00-00:59:59` = `06:00:00-00:59:59` / `06:00:00-00:59:59`[Monate == "Februar"])
saisonindex
Monate 06:00:00-00:59:59 06:00:00-08:59:59 09:00:00-12:59:59 13:00:00-16:59:59 17:00:00-19:59:59 20:00:00-22:59:59 23:00:00-00:59:59
1 Januar 1.2365089 0.2859446 0.4839630 0.8030493 1.4410173 2.759012 1.9254836
2 Februar 1.0000000 0.2890063 0.4767076 0.7588017 1.3538568 2.145851 0.9266933
3 März 0.9419595 0.3157198 0.4644285 0.6654849 1.2576761 2.008268 0.9214072
4 April 0.8961804 0.2955346 0.4497871 0.6354015 1.1478274 1.917198 0.9268036
5 Mai 0.8398460 0.2730415 0.4088478 0.6709692 1.0487195 1.742565 0.8703363
6 Juni 0.7578937 0.2612720 0.3990733 0.5807657 0.9649852 1.509921 0.8183238
7 Juli 0.7453580 0.2343150 0.3870521 0.6741874 0.9775892 1.385178 0.7503323
8 August 0.7272684 0.2216735 0.3717692 0.5756792 0.9959819 1.435887 0.7289555
9 September 0.8523844 0.2603578 0.3924824 0.6676677 1.0805496 1.875336 0.7956532
10 Oktober 0.9095675 0.2708419 0.4229002 0.6426542 1.2042836 2.039814 0.8560680
11 November 0.9273855 0.2653933 0.4111808 0.6657351 1.2933721 2.013661 0.9089147
12 Dezember 0.8698761 0.2460015 0.4168724 0.6457173 1.1790512 1.795447 0.9432285
I want to do this for all numeric columns dynamically, I guess mutate_if(is.numeric)
will do this, but I can not get my head around how it might work which the condition in the bracket.
Can you help me?
Upvotes: 1
Views: 1283
Reputation: 886948
Using mutate_if
, specify the ~
and then subset the column value where the 'Monate' is "Februar"
library(dplyr)
RWavg %>%
mutate_if(is.numeric, ~ ./.[Monate == "Februar"])
In base R
, just subset the row, get the lengths right, divide and update the columns
RWavg[-1] <- RWavg[-1]/RWavg[RWavg$Monate == 'Februar', -1][col(RWavg[-1])]
Upvotes: 4