Добавить / вычесть строку фрейма данных из другого фрейма данных r - PullRequest
1 голос
/ 28 марта 2019

Я уверен, что об этом уже спрашивали, но мне трудно его найти. Мне нужно поместить фрейм данных в одну строку и вычесть эти значения из соответствующих столбцов.

Я действительно нашел Вычтите значения одной строки из всех соответствующих столбцов в фрейме данных , что обеспечило решение (см. Ниже), но должен быть более простой способ, верно? tidyverse решение будет наиболее ценно.

Пример

Вот пример фрейма данных:

df <- as_tibble(matrix(1:9, 3, 3))
## A tibble: 3 x 3
#     V1    V2    V3
#  <int> <int> <int>
#1     1     4     7
#2     2     5     8
#3     3     6     9

Вычитание кадров данных одинакового размера - не проблема.

df - df
#  V1 V2 V3
#1  0  0  0
#2  0  0  0
#3  0  0  0

Задача

Но когда я помещаю df в одну строку и пытаюсь вычесть, он не может вычесть неравные кадры данных. Я подмножество df как

df[1, ]
## A tibble: 1 x 3
#     V1    V2    V3
#  <int> <int> <int>
#1     1     4     7

Мое желаемое решение вычтет 1 из каждого значения в первом столбце, 4 из каждого значения во втором и 7 из каждого в третьем, так что это результат:

## A tibble: 3 x 3
#     V1    V2    V3
#  <int> <int> <int>
#1     0     0     0
#2     1     1     1
#3     2     2     2

Попытка этого приводит к ошибке:

df - df[1, ]
#Error in Ops.data.frame(df, df[1, ]) : 
#  ‘-’ only defined for equally-sized data frames

В ссылке выше я нашел это решение, которое работает:

as_tibble(Map(`-`, df, df[1, ]))
## A tibble: 3 x 3
#     V1    V2    V3
#  <int> <int> <int>
#1     0     0     0
#2     1     1     1
#3     2     2     2

Но это решение кажется действительно сложным и его нелегко включить в серию каналов.

У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Мы можем реплицировать базу строк на индекс набора данных col. Это делает оба набора данных одинаковой длины / размера

df - unlist(df[1,])[col(df)]
#   V1 V2 V3
#1  0  0  0
#2  1  1  1
#3  2  2  2

если нам нужен параметр поворота, можно использовать map2

library(purrr)
library(dplyr)
map2_df(df, df[1, ], `-`)
# A tibble: 3 x 3
#     V1    V2    V3
#  <int> <int> <int>
#1     0     0     0
#2     1     1     1
#3     2     2     2

Или другой вариант uncount

df - uncount(df[1, ], nrow(df))

Или с помощью трубы

df %>% 
  slice(1) %>% 
  uncount(nrow(df)) %>%
  {df - .}
#  V1 V2 V3
#1  0  0  0
#2  1  1  1
#3  2  2  2

Или с mutate_all

df %>%
    mutate_all(list(~ . - first(.)))
# A tibble: 3 x 3
#     V1    V2    V3
#  <int> <int> <int>
#1     0     0     0
#2     1     1     1
#3     2     2     2
0 голосов
/ 28 марта 2019

Если вы просто пытаетесь вычесть первую строку в data.frame, то лучше подумать о том, чтобы просто вычесть первое значение из каждого столбца.Вы можете сделать это легко с dplyr

library(dplyr)
df %>% mutate_all(~.-first(.))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...