'for loop: dataframe * vector operation
I want to make some operations on my dataframe by multiplying cells value to a vector.
mydat <- dataframe(
type = rep("a", "b", "c", "d"),
site.a = c(10, 2.5,5,4),
site.b = c(6, 3, 7, 3.1),
site.c = c(2, 2.4, 6, 7),
site.d = c(9, 6, 7.2, 4.2))
I would like to multiply each column in order by the following vector
wall <- c(10.4, 11, 12, 13.5)
i.e I would like to have a for loop for the following:
mydat[2]*wall[1],
site.b*wall[2],
etc... until mydat[n+1]*wall[n]
I tried to following code but I doesn't work, It said the following error "unexpected "{" in "}"
while (i < 8) {
for i in (1:8) {
mydat[i+1] = mydat[i+1]/wall[i]
}
}
Can anyone help me? I am just beginning how to code and I am not familiar with looping
Solution 1:[1]
I just found the solution. The answer is actually shorter that I thought.
for (i in 1:4){
mydat2[,i+1] <- mydat[,i+1]/wall[i]
}
Solution 2:[2]
Consider no loops with matrix operations by expanding the wall vector to matrix of same size as mydat. Below assumes columns will be same between both objects:
wall_m <- matrix(wall, ncol=length(wall), nrow=nrow(mydat), byrow=TRUE)
mydat2[-1] <- mydat2[-1] / wall_m
Above approach yields identical results:
mydat <- data.frame(
type = c("a", "b", "c", "d"),
site.a = c(10, 2.5,5,4),
site.b = c(6, 3, 7, 3.1),
site.c = c(2, 2.4, 6, 7),
site.d = c(9, 6, 7.2, 4.2)
)
mydat2 <- mydat
wall <- c(10.4, 11, 12, 13.5)
# LOOP VERSION
for(i in (1:4)) {
mydat[i+1] = mydat[i+1]/wall[i]
}
# MATRIX VERSION
wall_m <- matrix(wall, ncol=length(wall), nrow=nrow(mydat2), byrow=TRUE)
mydat2[-1] <- mydat2[-1] / wall_m
identical(mydat, mydat2)
[1] TRUE
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 | 4in4ritr4 |
| Solution 2 | Parfait |
