我有一个数据框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
问题是我不知道如何指出应通过相应的矢量更改相应的列。
答案 0 :(得分:2)
我们可以使用base R
(假设列的顺序相同)
df + v[col(df)]
或使用tidyverse
library(purrr)
map2_df(df, v[names(df)], `+`)
注意:mutate_all
在'df'列中循环,但'v'则不是。没有使用mutate_all
答案 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)
然后,如果您希望将数据恢复为原始格式,则可以重新分发数据。