2016-10-17 3 views
0

je les données suivantes:Multiplier les lignes en dix colonnes, par les valeurs dans une colonne

ID <- c("CB1", "CB2","CB3") 
size <- c(10, 40, 4) 
Year.1 <- c(10, 6, 15) 
Year.2 <- c(12, 7, 20) 
Year.3 <- c(14, 8, 25) 
data <- data.frame(ID, size, Year.1, Year.2, Year.3) 

Je souhaite multiplier les valeurs pour tous les ans, par les valeurs dans la colonne « taille » (I avoir dix ans dans mon cadre de données réel). Les données devraient finir par ressembler à ceci.

ID <- c("CB1", "CB2","CB3") 
size <- c(10, 40, 4) 
Year.1 <- c(100, 240, 60) 
Year.2 <- c(120, 280, 80) 
Year.3 <- c(140, 320, 100) 
data <- data.frame(ID, size, Year.1, Year.2, Year.3) 

Idéalement, les nouvelles valeurs remplaceront les valeurs existantes pour chaque année, car je ne veux pas vraiment ajouter dix colonnes à mon trame de données.

+1

vous pouvez simplement faire ceci: 'cbind (données [, 1], les données [ , 2], data [3: 5] * data [, 2]) ' –

Répondre

0

lapply est un bon outil ici. Vous pouvez lui passer les vecteurs que vous voulez multiplier, une fonction anonyme qui fait la multiplication, et un argument supplémentaire pour les valeurs à multiplier par.

ID <- c("CB1", "CB2","CB3") 
size <- c(10, 40, 4) 
Year.1 <- c(10, 6, 15) 
Year.2 <- c(12, 7, 20) 
Year.3 <- c(14, 8, 25) 
df <- data.frame(ID, size, Year.1, Year.2, Year.3) 

df[, paste0("Year.", 1:3)] <- 
    lapply(df[, paste0("Year.", 1:3)], 
     function(x, y) x * y, 
     y = df$size) 

df 
    ID size Year.1 Year.2 Year.3 
1 CB1 10 100 120 140 
2 CB2 40 240 280 320 
3 CB3 4  60  80 100 
0

Une solution dplyr:

library("dplyr") 
# With dplyr_0.5.0 
data %>% mutate_at(.funs = funs(. * size), .cols = vars(contains("Year"))) 
# or with previous version 
data %>% mutate_each_(funs = funs(. * size), vars = vars(contains("Year"))) 
# ID size Year.1 Year.2 Year.3 
# 1 CB1 10 100 120 140 
# 2 CB2 40 240 280 320 
# 3 CB3 4  60  80 100 
6

Pourquoi ne pas ce simple dans la base R:

yr <- grep("Year", names(data)) # finds year columns 
data[,yr] <- data$size*data[,yr] 

# ID size Year.1 Year.2 Year.3 
#1 CB1 10 100 120 140 
#2 CB2 40 240 280 320 
#3 CB3 4  60  80 100 
+1

Très belle solution –

+1

La meilleure dans ce cas –