используйте mutate_if, вычитая из другого фрейма данных - PullRequest
0 голосов
/ 25 февраля 2019

Я хотел бы сделать (более или менее) следующее

dplyr::mutate_if(tmp, is.numeric, function(x) x-df[3,])

, по сути это должно вычитать при каждом x значение из df.У меня проблема в том, что он должен использовать только соответствующий номер столбца, то есть tmp[x,y] - df[3,y].Однако происходит то, что он проходит по вектору df[3,] для каждого x, независимо от положения столбца.

Есть ли способ заставить эту работу работать с mutate_if путем индексации столбца, чтобыть моим предпочтительным решением?

вот пример: tmp это:

tmp <- structure(list(x = c(1, 1, 1, 1),
                      y = c(2, 2, 2, 2)),
                 row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))

df (фактически матрица):

df <- structure(c(1L, 2L, 3L, 2L, 3L, 4L),
                .Dim = 3:2, .Dimnames = list(NULL, c("x", "y")))

теперь, когда я применяю mutateон возвращает:

structure(list(x = c(-2, -3, -2, -3),
               y = c(-1, -2, -1, -2)),
          class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L))

но я хочу, чтобы оно было:

structure(list(x = c(-2, -2, -2, -2),
               y = c(-2, -2, -2, -2)),
          class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L))

Надеюсь, это прояснит ситуацию

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

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

df1<-as.data.frame(df)
as_tibble(purrr::map2(tmp[,purrr::map_lgl(tmp,is.numeric)],df1[3,],function(x,y) x-y))

Это дает нам:

# A tibble: 4 x 2
      x     y
  <dbl> <dbl>
1    -2    -2
2    -2    -2
3    -2    -2
4    -2    -2
0 голосов
/ 25 февраля 2019

Это не идеальное решение, но оно даст вам то, что вы хотите (если мое понимание верно), и тогда вам придется поиграть с форматированием.Я не совсем понимаю, почему у вас есть целый фрейм данных для df, если вы заботитесь только о 3-й строке.Я не знаю, как индексировать столбец, используя dplyr::mutate_if;это было бы полезно знать!

Поскольку вы хотите, чтобы столбцы совпадали, вы фактически пытаетесь вычесть каждую строку tmp из установленной строки df.Для циклов и sapply() хороши для построчного вычитания.

sapply(1:nrow(tmp), function(x) tmp[x, ] - df[3, ]) %>% 
  as.data.frame() %>% 
  t()

##    x  y 
## V1 -2 -2
## V2 -2 -2
## V3 -2 -2
## V4 -2 -2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...