Home > database >  Error: Unable to apply package function to each row in R
Error: Unable to apply package function to each row in R

Time:08-26

I am trying to apply fm.Choquet function (Rfmtool package) to my R data frame, but no success. The function works like this (ref. here):

# let x <- 0.6 (N = 1)
# and y <- c(0.3, 0.5). y elements are always 2 power N (here, 2)
# env<-fm.Init(1). env is propotional to N
# fm.Choquet(0.6, c(0.3, 0.5),env) gives a single value output

I have this sample data frame:

set.seed(123456)
a <- qnorm(runif(30,min=pnorm(0),max=pnorm(1)))
b <- qnorm(runif(30,min=pnorm(0),max=pnorm(1)))
c <- qnorm(runif(30,min=pnorm(0),max=pnorm(1)))

df <- data.frame(a=a, b=b, c=c)
df$id <- seq_len(nrow(df))

I would like to apply fm.Choquet function to each row of my df such that, for each row (or ID), a is read as x, while b and c are read as y vector (N = 2), and add the function output as a new column for each row. However, I am getting the dimension error "The environment mismatches the dimension to the fuzzy measure.".

Here is my attempt.

df2 <- df %>% as_tibble() %>%
  rowwise() %>%
  mutate(ci = fm.Choquet(df$a,c(df[,2],df[,3]), env)) %>%
  mutate(sum = rowSums(across(where(is.numeric)))) %>% # Also tried adding sum which works
  as.matrix()

I am using dplyr::rowwise(), but I am open to looping or other suggestions. Can someone help me?

EDIT 1:

A relevant question is identified as a possible solution for the above question, but using one of the suggestions, by(), still throws the same error:

by(df, seq_len(nrow(df)), function(row) fm.Choquet(df$a,c(df$b,df$c), env))

CodePudding user response:

set.seed(123456)
a <- qnorm(runif(30, min = pnorm(0), max = pnorm(1)))
b <- qnorm(runif(30, min = pnorm(0), max = pnorm(1)))
c <- qnorm(runif(30, min = pnorm(0), max = pnorm(1)))

df <- data.frame(a = a, b = b, c = c)
df$id <- seq_len(nrow(df))

library(Rfmtool)
library(tidyverse)
env <- fm.Init(1)

map_dbl(
  seq_len(nrow(df)),
  ~ {
    row <- slice(df,.x)
    
    fm.Choquet(
      x = row$a,
      v = c(row$b, row$c), env
    )
  }
)
  •  Tags:  
  • r
  • Related