#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