Применить функцию к каждой строке в наборе данных при выполнении условий - PullRequest
0 голосов
/ 08 января 2020

У меня есть логическая переменная (parent_boolean). Если parent_boolean = True, тогда я хочу применить функцию к table_name, если parent_boolean = False, тогда я хочу применить другую функцию к table_name в наборе данных. Какой самый простой способ сделать это в DPLYR?

table_name    parent_table  parent_boolean column_count
 <chr>                                             <chr>                              <lgl>             <dbl>
1 table_1       table_1      TRUE                     1
2 table_2       table_1     FALSE                     3                                      

dp_child <- function(table_name, parent_table) { function runs SQL statement against database) 

dp_parent <- function(table_name) {function runs SQL statement against database) 

Я хочу запустить функцию dp_parent для каждой строки, в которой table_name является parent_table, и я хочу запустить функцию dp_child для каждой строки, в которой table_name не является parent_table.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Вот базовое решение R, использующее ifelse(), где пример игрушки дает, как показано ниже

# two distinct function
f1 <- function(x) x**2
f2 <- function(x) -sqrt(x)

# apply function to column B according to value in column A
df <- data.frame(A = c(T,T,F,T),B = 1:4)
df <- within(df, C <- ifelse(A,f1(B),f2(B)))

, такой что

> df
      A B         C
1  TRUE 1  1.000000
2  TRUE 2  4.000000
3 FALSE 3 -1.732051
4  TRUE 4 16.000000

РЕДАКТИРОВАТЬ с фрейм данных в вашем посте, может быть, вы можете попробовать код ниже

result <- apply(df, 1, function(v) {
  if (v["parent_boolean"]) {
    dp_parent(v["table_name"])
  } else {
    dp_child(v["table_name"],v["parent_table"])
  }
})
df <- cbind(df,result)
## or 
# add_column(df, result)
1 голос
/ 08 января 2020

Вы можете использовать ifelse при создании нового столбца, используя mutate:

A <- c(T,F,F,T,T)
B <- LETTERS[1:5]
df <- data.frame(A,B)

library(dplyr)
df %>% mutate(C = ifelse(A, paste0(B,1),paste0(B,"A")))

      A B  C
1  TRUE A A1
2 FALSE B BA
3 FALSE C CA
4  TRUE D D1
5  TRUE E E1

Отвечает ли он на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...