Я хотел бы сделать (более или менее) следующее
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 <- 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")))
теперь, когда я применяю мутацию, он возвращает:
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))
Я надеюсь, что это делает его более ясным
Есть ли причина, по которой вы не можете (временно) присоединиться к другой таблице в этой и получить к ней доступ таким образом?





Это не идеальное решение, но оно даст вам то, что вы хотите (если я правильно понимаю), и тогда вам придется поиграть с форматированием. Я не совсем понимаю, почему у вас есть весь фрейм данных для df, если вас интересует только 3-я строка. Я тоже не знаю, как индексировать столбец с помощью 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
Мы можем использовать 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
Является ли температура того же размера, что и дф?