Вычисление в R с использованием двух индексов

#r

#r

Вопрос:

 data1 <- structure(list(A = c(2755964268, 2755964268, 375194875,  
263031965, 
8499219585, 499373653.92, 280423947, 2158547197, 1128997565.89, 
1128997567, 1670585623, 3790282427.29, 3790282427.84, 73173066, 
195366117, 1642701650, 349564838), s2aum = c(0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241), s2mkt = c(0.31, 
0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 
0.31, 0.31, 0.31, 0.31, 0.31), b = c(0.625, 1.162, 
0.953, 0.002, 0.61, 0.948, 0.654, 0.002, 0.656, 0.552, 0.923, 
0.653, 0.002, 0.051, 0.032, 0.033, 0.05)), row.names = c(NA, 
-17L), class = c("tbl_df", "tbl", "data.frame"))

data2<-structure(list(A = c(400541354, 1759793458, 4596389511, 
400541354, 
64654237, 478899312, 5417062, 18592832, 18667854, 61344762, 25868625, 
5365055584, 5365055584, 27595349, 2457211376, 229229952, 6362880477, 
1250770399, 1570627004, 71104043, 71104043, 52225686, 1613077749, 
232150795, 5239674408, 61344762, 18667854, 27595349, 2832937760, 
3614230, 3614230, 475663543, 1289565081, 182105777, 182105777, 
182105777, 51124786, 51124786, 48653333, 2781054257, 51343213, 
234285653, 5365055584, 6711129454, 1532814176, 883507188, 883507188, 
691061024, 1613077749, 1613077749, 1613077749, 20095892222, 232150795, 
283099276, 283099276, 17720976, 5365055584, 5365055584, 1350545862, 
1025530733, 2781054257, 946525804, 995411261, 45532725, 232150795
), s2aum = c(0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 0.241, 
0.241, 0.241, 0.241, 0.241), s2mkt = c(0.31, 0.31, 0.31, 
0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 
0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 
0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 
0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 
0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 
0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31), b = c(0.895, 
1.102, 1.23, 0.959, 0.242, 1.011, 0.002, 1.311, 1.012, 0.988, 
1.146, 0.981, 0.336, 1.252, 0.858, 0.944, 1.034, 1.144, 0.931, 
0.273, 0.866, 0.947, 0.223, 0.934, 0.974, 0.331, 0.309, 0.897, 
0.958, 0.638, 1.107, 0.858, 0.999, 0.929, 0.957, 0.928, 0.625, 
1.057, 0.945, 0.931, 0.958, 1.011, 0.98, 0.867, 1.205, 0.929, 
0.236, 0.889, 0.945, 0.946, 0.804, 0.935, 0.933, 0.059, 0.959, 
0.849, 0.981, 0.98, 0.841, 1.279, 1.161, 0.985, 1.23, 1.26, 0.957
)), row.names = c(NA, -65L), class = c("tbl_df", "tbl", "data.frame"
))
  

Мне нужно вычислить для каждой i строки data1, есть j строки data2

Я думаю, что мне нужно сначала исправить i = 1 для всех j s, а затем сделать i = 2 для всех j s, а затем i = 3 для всех j s и т.д.

Формула, которую мне нужно вычислить, такова: [s2aum и s2mkt для обоих data1 и data2 одинаковы]

Number_(i,j)=(A_i-A_j ) ^ 2/s2aum (b_i-b_j ) ^ 2/s2mkt

Я попробовал следующий код:

 Number <- matrix()
for (i in 1:nrow(data1)){
  for (j in 1:nrow(data2)){
    Number[i,j] = (data1$A[i] - data2$A[j])^2 / data1$s2aum   
      (data1$b[i] - data2$b[j])^2 / data2$s2mkt
  print(Number[i,j])
    }
}
  

Но в нем есть ошибки.

Ответ №1:

Не уверен, что вы подразумеваете под «Мне нужно вычислить для каждых i строк data1, есть j строк data2», поскольку попытка формулы и кода выглядит так, как будто вы хотите получить одно значение для каждой комбинации из 1 строки из data1 и 1 строки из data2.

Посмотрите, имеет ли это смысл для вас:

 library(dplyr)

# create a data frame where each row is a i_j combination of rows from data1 amp; data2
result <- expand.grid(row.1 = seq(1, nrow(data1)), 
                      row.2 = seq(1, nrow(data2)),
                      KEEP.OUT.ATTRS = FALSE) %>%
  
  # add each dataset to the combined data frame
  left_join(data1 %>% mutate(row.1 = seq(1, n())) %>%
              rename(A1 = A, b1 = b),
            by = "row.1") %>%
  left_join(data2 %>% mutate(row.2 = seq(1, n())) %>% 
              rename(A2 = A, b2 = b) %>%
              select(A2, b2, row.2), by = "row.2") %>%
  
  # calculate result for each i_j combination
  mutate(value = (A1 - A2)^2 / s2aum   (b1-b2)^2 / s2mkt) %>%
  
  # sort results in order
  arrange(row.1, row.2)

# put results in appropriate matrix form
result.matrix <- matrix(result$value, nrow = nrow(data1), byrow = TRUE)
  

Комментарии:

1. Спасибо, это фантастика! я сейчас это изучаю. Спасибо!

2. Большое вам спасибо! для меня это имеет смысл. Спасибо!

3. Рад помочь. 🙂 Еще один совет: с риском чрезмерного обобщения циклы почти никогда не являются ответом для выполнения какой-либо задачи в R. Circle 3 в R inferno имеет хорошую дискуссию по этому поводу.

4. Могу я спросить, какая книга лучше всего подходит для разработки программирования на R, например, для написания рекурсивных алгоритмов, lapply, mapply, чего-то эквивалентного циклам и т.д.? я думаю, что я промежуточный пользователь R, но у меня нет степени в области компьютерных наук или математики, спасибо! @Z.Лин

5. Не уверен, есть ли единственное «лучшее» руководство по R, но следующее может быть хорошим местом для начала просмотра: bigbookofr.com/index.html