Janet
Janet

Reputation: 225

Error: "Argument 1 must have names" using lapply within a function in R

I am trying to use a general function to calculate the difference between rows in 2 datasets with different length. My first function takes only one row that we specify and do the calculation, but i was interested to apply this function but over all the rows in my dataset or matrix, i tried lapply but i get an error Error: Argument 1 must have names and took a look at this answer Problem with bind_rows: Error: Argument 1 must have names but did not understand it. Any help would be appreciated

# datasets
d1 = data.frame(V1=1:5,V3=6:10)
d2 = data.frame(V1=c(2,3,4,5), V2=c(6,6,5,9))
 d1
  V1 V3
1  1  6
2  2  7
3  3  8
4  4  9
5  5 10
 d2
  V1 V2
1  2  6
2  3  6
3  4  5
4  5  9

# the first function 
soustraction.i=function(databig,datasmall,i,threshold){
  databig=as.data.frame(databig)
  datasmall=as.data.frame(datasmall)
  dif=map2_df(databig, datasmall[i,], `-`)
  dif[dif<0] = 0
  dif$mismatch=rowSums(dif)
  dif=dif[which(dif$mismatch <= threshold),]
  return(dif)
  
}
# If i am interested the first row in d2 with all rows in d1 i get the right answer
 soustraction.i(d1,d2,1,3)
# A tibble: 3 x 3
     V1    V3 mismatch
  <dbl> <dbl>    <dbl>
1     0     0        0
2     0     1        1
3     1     2        3

# However, i do not know how to do the same calculation but over all the rows in d2 (the small dataset)
# d2 is always smaller than d1
# Here is what i tried 
#The seconf function 

soustraction.matrice=function(d1,d2,threshold){ 
  d1=as.matrix(d1)
  d2=as.matrix(d2)
  n=nrow(d2)
  diff.mat=lapply(1:n,soustraction.i,d1,d2)
  diff.mat=as.data.frame(diff.mat)
  return(diff.mat)
}

 soustraction.matrice(d1,d2,3)
#Error: Argument 1 must have names.

The expected output of the 2nd function should be , for example if i set the threshold at 3 (I am not sure the threshold should be redefined in the 2nd function )

     V1    V3 mismatch
  <dbl> <dbl>    <dbl>
1     0     0        0
2     0     1        1
3     1     2        3
4     0     0        0
5     0     1        1
6     0     2        2
7     0     1        1
8     0     2        2
9     0     3        3
10    0     0        0
11    0     0        0
12    0     0        0
13    0     0        0
14    0     1        1

Upvotes: 1

Views: 131

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 388982

You can use map_df and apply the function for each row in d2.

purrr::map_df(1:nrow(d2), ~soustraction.i(d1,d2,.x,3))

# A tibble: 14 x 3
#      V1    V3 mismatch
#   <dbl> <dbl>    <dbl>
# 1     0     0        0
# 2     0     1        1
# 3     1     2        3
# 4     0     0        0
# 5     0     1        1
# 6     0     2        2
# 7     0     1        1
# 8     0     2        2
# 9     0     3        3
#10     0     0        0
#11     0     0        0
#12     0     0        0
#13     0     0        0
#14     0     1        1

Similarly, with lapply you can do :

do.call(rbind, lapply(1:nrow(d2), function(x) soustraction.i(d1,d2,x,3)))

Upvotes: 1

Related Questions