简体   繁体   中英

R multiply columns by values in second dataframe

I have two dataframes: df1

plot   grass moss   rock    other     stuff  
a      4      0     0       text      3
b      2      2     3       text      4
c      10     0     0       text      0
d      3      1     0       text      9

and df2

Cover  value
grass   5
moss    2
rock    3

I would like to multiply the values in df1 by the corresponding value in df2. The solution should be applicable for a large dataset.

Result df3

plot  grass moss    rock    
a     20      0     0      
b     10      4     9      
c     50      0     0       
d     15      2     0      

Your data:

df1 <- read.table(
  text = 
    "plot   grass moss   rock    other     stuff  
    a      4      0     0       text      3
    b      2      2     0       text      4
    c      10     0     0       text      0
    d      3      1     0       text      9",
  header = TRUE
)

df2 <- read.table(
  text = 
    "Cover  value
    grass   5
    moss    2
    rock    3",
  header           = TRUE,
  stringsAsFactors = FALSE
)

(Make sure that Cover is a character vector, not a factor, for this solution.)

A simple for loop does the trick:

df3 <- df1
for(i in seq_len(nrow(df2)))
{
  df3[, df2$Cover[i]] <- df2$value[i] * df1[, df2$Cover[i]]
}

For those looking for a tidyverse approach the following also works using the new across() and cur_column() functions:

df1 %>% 
  mutate(across(.cols = c(grass, moss, rock),
                .fns = function(x){
                  x * (df2 %>% 
                         filter(Cover == cur_column()) %>% 
                         pull(value))
                }))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM