通过从另一个数据帧中减去来使用mutate_if

时间:2019-02-24 22:49:56

标签: r dataframe dplyr mutate

我想(或多或少)执行以下操作

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 :(得分:1)

我们可以使用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

答案 1 :(得分:0)

这不是一个完美的解决方案,但是它将为您提供所需的内容(如果我的理解是正确的话),然后您必须使用格式。如果您只关心第3行,我不太理解为什么您拥有df的整个数据帧。我也不知道如何使用dplyr::mutate_if为列建立索引;知道这将很有用!

由于您希望各列匹配,因此您实际上正在尝试从tmp的设定行中减去df的每一行。 For循环和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