2016-10-17 2 views
0

У меня есть следующие данные:Умножение строки в десяти столбцах, по значениям в одном столбце

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) 

Я хочу, чтобы умножить значения за все годы, по значениям в столбце «Размер» (I имеют десять лет в моем фактическом фрейме данных). Данные должны выглядеть следующим образом.

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) 

В идеале, новые значения заменят существующие значения для каждого года, как я не хочу, чтобы добавить еще десять столбцов в мой кадр данных.

+1

вы можете просто сделать это: 'cbind (данные [, 1], данные [ , 2], данные [3: 5] * данные [, 2]) ' –

ответ

0

lapply - хороший инструмент здесь. Вы можете передать ему векторы, которые вы хотите размножить, анонимную функцию, которая выполняет умножение, и дополнительный аргумент для умножения значений.

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

Раствор с 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

Почему это не просто в базе 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

Очень хорошее решение –

+1

Лучшее в этом случае –

Смежные вопросы