Попробуйте следующее:
Определение таблицы:
DROP TABLE IF EXISTS category;
CREATE TABLE category (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20),
parent_id INT,
CONSTRAINT fk_category_parent FOREIGN KEY (parent_id)
REFERENCES category (id)
) engine=innodb;
Экспериментальные строки:
INSERT INTO category VALUES
(19, 'category1', NULL),
(20, 'category2', 19),
(21, 'category3', 20),
(22, 'category4', 21),
(23, 'categoryA', 19),
(24, 'categoryB', 23),
(25, 'categoryC', 23),
(26, 'categoryD', 24);
Рекурсивная хранимая процедура:
DROP PROCEDURE IF EXISTS getpath;
DELIMITER $$
CREATE PROCEDURE getpath(IN cat_id INT, OUT path TEXT)
BEGIN
DECLARE catname VARCHAR(20);
DECLARE temppath TEXT;
DECLARE tempparent INT;
SET max_sp_recursion_depth = 255;
SELECT name, parent_id FROM category WHERE id=cat_id INTO catname, tempparent;
IF tempparent IS NULL
THEN
SET path = catname;
ELSE
CALL getpath(tempparent, temppath);
SET path = CONCAT(temppath, '/', catname);
END IF;
END$$
DELIMITER ;
Функция обертки для хранимой процедуры:
DROP FUNCTION IF EXISTS getpath;
DELIMITER $$
CREATE FUNCTION getpath(cat_id INT) RETURNS TEXT DETERMINISTIC
BEGIN
DECLARE res TEXT;
CALL getpath(cat_id, res);
RETURN res;
END$$
DELIMITER ;
Выберите пример:
SELECT id, name, getpath(id) AS path FROM category;
Выход:
+----+-----------+-----------------------------------------+
| id | name | path |
+----+-----------+-----------------------------------------+
| 19 | category1 | category1 |
| 20 | category2 | category1/category2 |
| 21 | category3 | category1/category2/category3 |
| 22 | category4 | category1/category2/category3/category4 |
| 23 | categoryA | category1/categoryA |
| 24 | categoryB | category1/categoryA/categoryB |
| 25 | categoryC | category1/categoryA/categoryC |
| 26 | categoryD | category1/categoryA/categoryB/categoryD |
+----+-----------+-----------------------------------------+
Фильтрация строк определенным путем :
SELECT id, name, getpath(id) AS path FROM category HAVING path LIKE 'category1/category2%';
Выход:
+----+-----------+-----------------------------------------+
| id | name | path |
+----+-----------+-----------------------------------------+
| 20 | category2 | category1/category2 |
| 21 | category3 | category1/category2/category3 |
| 22 | category4 | category1/category2/category3/category4 |
+----+-----------+-----------------------------------------+
Мой предполагаемый вывод - просто возвращать значения hmin после запуска фрейма данных переменных с использованием функции и сохранения его в векторе. Как я могу сделать это?
blockquote>Так как ваша функция векторизована, сделайте это:
result = hmin(H = dataframe1$H1, M = dataframe1$M1, s = dataframe1$s1) # same thing, using the with() helper function to save typing result = with(dataframe1, hmin(H = H1, M = M1, s = s1))
Гораздо проще, если вы используете dplyr
> library(dplyr)
> dataframe1 <- data.frame(H1,M1,s1)
> hmin <- function(H,M,s) {
+ H - ((2*9.8*M)/1.5*s)
+ }
> dataframe1 %>%
+ mutate(hminscores = hmin(H1, M1, s1))
H1 M1 s1 sensitivity
1 50 70.5 20 -18374.0
2 50 70.5 21 -19295.2
3 50 70.5 22 -20216.4
4 50 70.5 23 -21137.6
5 50 70.5 24 -22058.8
6 50 70.5 25 -22980.0
7 50 70.5 26 -23901.2
8 50 70.5 27 -24822.4
9 50 70.5 28 -25743.6
10 50 70.5 29 -26664.8
11 50 70.5 30 -27586.0
12 50 70.5 31 -28507.2
13 50 70.5 32 -29428.4
14 50 70.5 33 -30349.6
15 50 70.5 34 -31270.8
16 50 70.5 35 -32192.0
17 50 70.5 36 -33113.2
18 50 70.5 37 -34034.4
19 50 70.5 38 -34955.6
20 50 70.5 39 -35876.8
21 50 70.5 40 -36798.0
Если вам нужен только вектор, вы также можете использовать apply
:
> hminscores <- apply(dataframe1, 1, function(x) {
+ hmin(x[1], x[2], x[3])
+ })
> hminscores
[1] -18374.0 -19295.2 -20216.4 -21137.6 -22058.8 -22980.0 -23901.2 -24822.4 -25743.6
[10] -26664.8 -27586.0 -28507.2 -29428.4 -30349.6 -31270.8 -32192.0 -33113.2 -34034.4
[19] -34955.6 -35876.8 -36798.0