Мы можем использовать sweep
, чтобы применить все столбцы «Fi sh» в строке к соответствующему Sample_surface
.
cols<- grep('Fish', names(df))
sweep(df[cols], 1, df$Sample_surface, `/`)/100
head(df)
# Year Location_nr Sample_surface Fish1 Fish2 Fish3 Fish4
#1 1990 1 3 1.0967 0.050 1.410 1.530
#2 1991 2 3 0.0733 0.383 1.223 0.703
#3 1992 3 10 0.4100 0.093 0.285 0.173
#4 1993 4 2 2.2150 1.305 1.975 1.360
#5 1994 5 6 0.5133 0.390 0.263 0.742
#6 1995 6 5 0.2680 0.910 0.240 0.602
Или мы можем использовать apply
по строкам
df[-c(1:3)] <- t(apply(df[-c(1:2)], 1, function(x) x[-1]/x[1]/100))
данные
set.seed(123)
Year <- c(1990:2019)
Location_nr <- c(1:30)
df <- data.frame(Year,Location_nr)
df$Sample_surface <- sample(10, size = nrow(df), replace = TRUE)
df$Fish1 <- sample(0:500, size = nrow(df), replace = TRUE)
df$Fish2 <- sample(0:500, size = nrow(df), replace = TRUE)
df$Fish3 <- sample(0:500, size = nrow(df), replace = TRUE)
df$Fish4 <- sample(0:500, size = nrow(df), replace = TRUE)