'How to loop over several rows multiplicating with a constant number in R?
I have a problem coding the following task:
| gene | constant value | Value A | Value B | Value C | Value D |
|---|---|---|---|---|---|
| ABCD | 0.5224 | 123 | 456 | 789 | 123 |
| EFGH | 0.556 | 254 | 267 | 2334 | 12334 |
| IJKL | 0.7226 | 23423 | 56345 | 67867 | 17534 |
| MNOP | 0.0001 | 2423 | 143 | 1554 | 1344 |
Given this table I want to multiply every value with the constant value of the row, so in the end the code should calculate this:
| gene | constant value | Value A | Value B | Value C | Value D |
|---|---|---|---|---|---|
| ABCD | 0.5224 | 123 * 0.5224 | 456 * 0.5224 | 789 * 0.5224 | 123 * 0.5224 |
| EFGH | 0.556 | 254 * 0.556 | 267 * 0.556 | 2334 * 0.556 | 12334 * 0.556 |
| IJKL | 0.7226 | 23423 * 0.7226 | 56345 * 0.7226 | 67867 * 0.7226 | 17534 * 0.7226 |
| MNOP | 0.0001 | 2423 * 0.0001 | 143 * 0.0001 | 1554 * 0.0001 | 1344 * 0.0001 |
Can anyone help how to implement this in R programming language?
Kind regards,
Hashriama
Solution 1:[1]
Another possible solution, based on base R:
(I have just noticed that @Sotos had, in a comment, suggested something very similar; therefore, I am going to remove my answer.)
df[-(1:2)] <- df$constant.value * df[-(1:2)]
df
#> gene constant.value Value.A Value.B Value.C Value.D
#> 1 ABCD 0.5224 64.2552 238.2144 412.1736 64.2552
#> 2 EFGH 0.5560 141.2240 148.4520 1297.7040 6857.7040
#> 3 IJKL 0.7226 16925.4598 40714.8970 49040.6942 12670.0684
#> 4 MNOP 0.0001 0.2423 0.0143 0.1554 0.1344
Solution 2:[2]
Using the dplyr package, you can use the across() helper function to apply the same operation across multiple columns that starts_with "Value".
library(dplyr)
# dplyr approach
df %>% mutate(across(starts_with("Value"), ~.x * `constant value`))
# or similarly in base R
df[, grepl("Value", colnames(df))] <- df[, grepl("Value", colnames(df))] * df$`constant value`
gene constant value Value A Value B Value C Value D
1 ABCD 0.5224 64.2552 238.2144 412.1736 64.2552
2 EFGH 0.5560 141.2240 148.4520 1297.7040 6857.7040
3 IJKL 0.7226 16925.4598 40714.8970 49040.6942 12670.0684
4 MNOP 0.0001 0.2423 0.0143 0.1554 0.1344
Input data
df <- read.table(header = T, sep = "\t", check.names = F, text = "
gene constant value Value A Value B Value C Value D
ABCD 0.5224 123 456 789 123
EFGH 0.556 254 267 2334 12334
IJKL 0.7226 23423 56345 67867 17534
MNOP 0.0001 2423 143 1554 1344")
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | PaulS |
| Solution 2 |
