[R] How to apply a function to every element of a dataframe, when the function uses for each colummn and row different values to calculate with?

Jacqueline Oehri jacqueline.oehri at gmail.com
Tue Aug 20 18:43:17 CEST 2013


Dear R users


I have a question concerning applying a function to each element of a dataframe:


1)
--> I have a dataframe like this: "d":
(columnames: names of Landcovertypes, rownames: coordinates,  nr:
rowsums, nc:colummnsums)
(look at the end of the mail for the structure of d, dput(d) )
here, "d" has 14 rows and 6 colummns:

> d
       PL_7_1_7.txt PL_7_1_8.txt PUEH_4_0.txt PUEH_7_1_2.txt UEH_7_2_2.txt nr
821194            0            0            0              0             0    29
821202            0            0            0              0             0     8
821206            1            0            0              0             0     2
827162            1            0            0              0             0     6
827166            0            1            1              1             1    17
827178            0            0            0              0             0     0
827182            1            0            0              0             0     4
827186            0            0            0              0             0    16
827190            0            0            0              0             0    16
827194            0            0            0              0             0    18
827198            0            0            0              0             0    19
827206            0            0            0              0             0    19
833166            0            0            0              0             0     8
nc               86          120          905            300           309 18733


-->And i want to apply the following function "f" to each element xij
of the dataframe "d":
(xij is the element of the dataframe "d" at row nr. "i" and colummn
nr. "j", x11 is therefore the element in the first row & the first
collumn, which in case of "d" is equal to "0".)

f = (x[i][j] -((nr[i]*nc[j])/n))^2/((nr[i]*nc[j])/n)


so that in the end I will have a new dataframe "e", which contains the
results of the function "f" as its elements instead of the original
values! (do you know what I mean?)
Do you have any hints how to do that?

2) After this, I wanted to filter out for EACH ROW in "e"  the maximum
value in the row & assign or link the respective columname of this
maxiumum value to the respective rowname;
so that in the end I will know for each rowname, which columname "fits
best to it" i.e. which columname had the biggest value for this
respective row.
For example, in dataframe "d", in the third row called "821206 ", the
maximum-value lies in the first colummn, which is named "PL_7_1_7.txt
". In this example I would link the name "821206 " somehow to the name
"PL_7_1_7.txt ".

Do you have any suggestions for me, how to do this the best way? or
where i should look up possible solutions? I m really lost...

What i tried until now was this:

>
f.good <- function(x, nr, nc, n) {
  n <-  d[14,6]
  nr <- d[,6]
  nc <- d[14,]
  z1 <- (x-((nr*nc)/n))^2/((nr*nc)/n)
  return(z1)
}

and then i wanted to use the "apply" function:

>
apply(d, c(1,2), f.good)

but it never worked at all, and I think Im far away from a solution!

Can somebody help me out and give me a hint what to do? does somebody
know a clever way to achieve tasks 1) &2) ?

Im very glad about every input!!!!!

Thanks a lot already!!! Have a nice day!

Best wishes,
Jacqueline


> dput(d)
structure(list(PL_7_1_7.txt = c(0, 0, 1, 1, 0, 0, 1, 0, 0, 0,
0, 0, 0, 86), PL_7_1_8.txt = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 120), PUEH_4_0.txt = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 905), PUEH_7_1_2.txt = c(0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 300), UEH_7_2_2.txt = c(0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 309), nr = c(29, 8, 2, 6, 17, 0, 4, 16, 16, 18, 19,
19, 8, 18733)), .Names = c("PL_7_1_7.txt", "PL_7_1_8.txt", "PUEH_4_0.txt",
"PUEH_7_1_2.txt", "UEH_7_2_2.txt", "nr"), row.names = c("821194",
"821202", "821206", "827162", "827166", "827178", "827182", "827186",
"827190", "827194", "827198", "827206", "833166", "nc"), class = "data.frame")



More information about the R-help mailing list