Запустить функцию в цикле на фрейме данных из 3 значений

Попробуйте следующее:

Определение таблицы:

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 |
+----+-----------+-----------------------------------------+
0
задан MY.BK 3 March 2019 в 08:16
поделиться

2 ответа

Мой предполагаемый вывод - просто возвращать значения hmin после запуска фрейма данных переменных с использованием функции и сохранения его в векторе. Как я могу сделать это?

Так как ваша функция векторизована, сделайте это:

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))
0
ответ дан Gregor 3 March 2019 в 08:16
поделиться

Гораздо проще, если вы используете 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
0
ответ дан Sonny 3 March 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: