#r #svd
Вопрос:
Я хочу использовать функцию svd для получения особых значений больших наборов данных в списке. Когда я использую функцию svd в одной матрице, я могу использовать $d и получать значения, но для списка я не могу получить выходные данные. Вот код для матрицы и выходные данные.
tb = matrix(c(64, 112, 59, 174, 111, 37,
39, 135, 115, 92, 161, 70,
93, 119, 50, 142, 20, 114,
149, 191, 62, 17, 145, 21,
60, 37, 29, 74, 42, 242), nrow = 5, ncol = 6, byrow = TRUE)
## Compute SVD of tb
#
my_svd = svd(tb)
## Retrieve (save) singular values
#
sv = my_svd$d
## Compute ratio between "1st/2nd" amp; "2nd/3rd" singular values
#
ratios = matrix(c(sv[1]/sv[2], sv[2]/sv[3]), nrow = 1)
colnames(ratios) = c("sv1/sv2", "sv2/sv3")
## Print ratios
ratios
Как мне применить это к списку наборов данных?
мой текущий код
svdresult <- lapply(d1,svd)
svdresult
d1-это мой список наборов данных
Как мне получить svdresult$d в списке наборов данных.
Thanks in advance
Комментарии:
1. И составьте таблицу, как в приведенном выше коде, пожалуйста
Ответ №1:
Может быть, что-то вроде следующего?
get_svd_ratios <- function(data) {
sv = svd(data)$d
n = length(sv)
ratios = matrix(sv[1:(n - 1)] / sv[2:n] , nrow = 1)
names = paste(
paste0("sv", 1:(n - 1)),
paste0("sv", 2:n),
sep = "/"
)
colnames(ratios) = names
return(ratios)
}
lapply(list(tb), get_svd_ratios)
# [[1]]
# sv1/sv2 sv2/sv3 sv3/sv4 sv4/sv5
# [1,] 2.261771 1.680403 1.29854 2.682195
Комментарии:
1. Большое спасибо. Это работает. Однако мне нужны только первые два. т. е. sv1/sv2, sv2/sv3. Как мне настроить код, пожалуйста.
2. Мне удалось скорректировать код. Большое спасибо.