我想(或多或少)执行以下操作
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))
我希望情况会更清楚
答案 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