Вычисление скалярного произведения между строками в фреймах данных в списке и вектором в R - PullRequest
0 голосов
/ 07 мая 2020

Я хочу получить внутренний точечный продукт между каждой строкой фреймов данных в списке и вектором; где в списке есть фреймы данных (поэтому фреймы данных следует хранить отдельно в списке). Я могу сделать это при использовании вычитания, но не для скалярного произведения. См. Пример кода ниже.

#Example data
V1 <- c(1, 2)
V2 <- c(3, 4)
V3 <- c(5, 6)
df1 <- tibble(V1, V2, V3)

V1 <- c(7, 8, 9)
V2 <- c(10, 11, 12)
V3 <- c(13, 14, 15)

df2 <- tibble(V1, V2, V3)

df_list <- list(df1, df2)
df_list

vector <- c(2, 2, 2)

df_list_subtract <- df_list %>%
  map(~ map2_df(.x, vector, `-`)) 
df_list_subtract

# Does not work
df_list_dotproduct <- df_list %>%
  map(~ map2_df(.x, vector, `%*%`)) 
df_list_dotproduct
# Does not work
df_list_dot_product <- df_list %>%
  map(~ map2_df(.x, rep(vector, each = x), `%*%`)) 
df_list_dot_product

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

tidyverse на самом деле не очень хорошо работает по строкам.

Вот базовый способ R:

lapply(df_list, function(x) apply(x, 1, `%*%`, vector))

#[[1]]
#[1] 18 24

#[[2]]
#[1] 60 66 72

Или используя tidyverse

library(purrr)
df_list %>% map(~pmap_dbl(., ~c(...) %*% vector))
1 голос
/ 07 мая 2020

Вы получаете ошибку, потому что матрица не соответствует требованиям, то есть вы можете делать только mxn% *% nx (что-то). Итак, вам просто нужно преобразовать data.frame в матрицу, чтобы он был 3x (что-то), и все должно было быть в порядке:

Вам не нужна map2, если у вас нет другого столбца для умножения, но я не вижу здесь:

df_list %>% map(~as.matrix(.x) %*% vector)
[[1]]
     [,1]
[1,]   18
[2,]   24

[[2]]
     [,1]
[1,]   60
[2,]   66
[3,]   72
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...