В R вычесть вектор из каждой строки фрейма данных - PullRequest
0 голосов
/ 07 мая 2020

Я ищу лучшее и более эффективное решение для вычитания вектора из каждой строки фрейма данных (df1). Мое текущее решение повторяет вектор (Ve c) для создания фрейма данных (Vec_df1) с такой же длиной, что и df1, а затем вычитает два фрейма данных. Теперь мне интересно, есть ли более «прямой» способ сделать это без необходимости создавать новый фрейм данных Vec_df1 (желательно в tidyverse). См. Пример данных ниже.

#Example data
V1 <- c(1, 2, 3)
V2 <- c(4, 5, 6)
V3 <- c(7, 8, 9)

df1 <- tibble(V1, V2, V3)
Vec <- c(1, 1, 2)

# Current solution, creates a dataframe with the same nrows by repeating the vector. 
Vec_df1 <- tibble::as_tibble(t(Vec)) %>%
  dplyr::slice(rep(dplyr::row_number(), nrow(df1)))

# Subtraction. 
df2 <- df1-Vec_df1
df2

Заранее спасибо

Ответы [ 4 ]

3 голосов
/ 07 мая 2020

Аналогичный подход с использованием map2_df():

library(purrr)

map2_df(df1, Vec, `-`)

# A tibble: 3 x 3
     V1    V2    V3
  <dbl> <dbl> <dbl>
1     0     3     5
2     1     4     6
3     2     5     7
3 голосов
/ 07 мая 2020

Мы можем использовать sweep:

sweep(df1, 2, Vec, `-`)
# `-` is default FUN in sweep so you can also use
#sweep(df1, 2, Vec)

#  V1 V2 V3
#1  0  3  5
#2  1  4  6
#3  2  5  7

Или попытку, аналогичную вашей

df1 - rep(Vec, each = nrow(df1))
1 голос
/ 07 мая 2020

самый быстрый способ сделать это:

as_tibble(t(t(df1) - Vec))

# A tibble: 3 x 3
     V1    V2    V3
  <dbl> <dbl> <dbl>
1     0     3     5
2     1     4     6
3     2     5     7
0 голосов
/ 07 мая 2020

Мы также можем

df1 - Vec[col(df1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...