如何将命名向量中的dataframe值添加到每一列?

时间:2019-05-08 15:14:16

标签: r dplyr

我有一个数据框df。

df <- data.frame(c(4,4,4,4,4,4), c(0,0,0,0,0,0))
colnames(df) <- c("a", "b")
> df
     a   b
1    4   0
2    4   0
3    4   0
4    4   0
5    4   0
6    4   0

还有一个命名向量v,其中名称与我的数据框中的列名称相对应。

v <- c(0.04, 0.01)
names(v) <- c("a", "b")
> v
      a       b 
   0.04    0.01 

我的数据框中可能有很多列,向量将始终具有相应的名称。

我想从对应的向量中添加到列值的每个元素中,以便得到如下结果:

> df
     a      b
1    4.04   0.01
2    4.04   0.01
3    4.04   0.01
4    4.04   0.01
5    4.04   0.01
6    4.04   0.01

我该如何使用dplyr? 到目前为止,我所想的只是

df %>% mutate_all(. = . + v[.])

但这给我一个错误。

Error in mutate_all(., . = . + v[.]) : 
  argument 2 matches multiple formal arguments

问题是我不知道如何指出应通过相应的矢量更改相应的列。

2 个答案:

答案 0 :(得分:2)

我们可以使用base R(假设列的顺序相同)

df + v[col(df)]

或使用tidyverse

library(purrr)
map2_df(df, v[names(df)], `+`)

注意:mutate_all在'df'列中循环,但'v'则不是。没有使用mutate_all

选择与'df'中的列相对应的'v'元素的索引

答案 1 :(得分:0)

这应该是一个一般情况:

library(tidyverse)

df <-
  tibble(
    a = rep(4, 6),
    b = rep(0, 6)
  )

v <- c(0.04, 0.01)
names(v) <- c("a", "b")

v_df <- 
  v %>% 
  enframe() %>% 
  transmute(name, v_value = value)

df %>% 
  gather(key = name, value = value, a:b) %>% 
  left_join(v_df, by = "name") %>% 
  transmute(name, new_value = value + v_value)

然后,如果您希望将数据恢复为原始格式,则可以重新分发数据。