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

如何将命名向量中的值添加到dataframe的每列中?,r,dplyr,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") 和一个命名向量v,其中名称对应于我的数据帧中的列名 v <- c(0.04, 0.01) names(v) <- c("a", "b") 我的数据框中可能有很多列,vector总是有相应的名称 我想将对应向量中的值添加到列的每个元素中,得到如下结果: > df a b 1

我有一个数据帧df

df <- data.frame(c(4,4,4,4,4,4), c(0,0,0,0,0,0))
colnames(df) <- c("a", "b")
和一个命名向量v,其中名称对应于我的数据帧中的列名

v <- c(0.04, 0.01)
names(v) <- c("a", "b")
我的数据框中可能有很多列,vector总是有相应的名称

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

> 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

问题是我不知道如何指出对应的列应该被对应的向量改变。

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


或者使用
tidyverse

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


注意:
mutate\u all
循环通过'df'列,但'v'不是这种情况。使用
mutate\u all
我们可以使用
base R
(假设列的顺序相同),没有索引来选择与“df”中的列相对应的“v”元素


或者使用
tidyverse

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


注意:
mutate\u all
循环通过'df'列,但'v'不是这种情况。使用
mutate\u all

选择与“df”中的列相对应的“v”元素时没有索引。这应作为一般情况:

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)
库(tidyverse)
df%
左联合(v_df,by=“name”)%%>%
转换(名称,新值=值+v值)

然后,如果希望数据返回到原始格式,则可以重新展开数据。

这应作为一般情况:

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)
库(tidyverse)
df%
左联合(v_df,by=“name”)%%>%
转换(名称,新值=值+v值)

然后,如果希望数据返回原始格式,您可以将其重新展开。

Better
df[names(v)]我知道这很简单,但没想到会这么简单。非常感谢。有什么方法可以像我的例子中那样进行管道输送吗?@Ааі佐夫斯基你可以做
df%>%map2_df(v[names(df)],“+”
Better
df[names(v)]我知道这很简单,但没想到会这么简单。非常感谢。有什么方法可以像我的例子中那样进行管道输送吗?@Ааіа佐夫斯基你可以做
df%>%map2\u df(v[names(df)],“+”
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)