Как добавить в каждый столбец значение dataframe из именованного вектора? - PullRequest
0 голосов
/ 08 мая 2019

У меня есть датафрейм 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 ]

2 голосов
/ 08 мая 2019

Мы можем использовать base R (при условии, что столбцы расположены в одном и том же порядке)

df + v[col(df)]

Или используя tidyverse

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

ПРИМЕЧАНИЕ:mutate_all проходит по столбцам df, но это не относится к v.Нет индекса для выбора элемента 'v', соответствующего столбцу в 'df', используя mutate_all

0 голосов
/ 08 мая 2019

Это должно работать в общем случае:

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)

Затем вы можете разложить данные, если хотите, чтобы они вернулись в исходный формат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...