loop calculation as it go in r

dataframe, loops, r

Solution

Edit:

more succinctly, you could use `sapply` and `rowSums` to do away with the `for-loop` into a single line of code:

# Initialize values of relationA
myd$relationA <- 0
myd$relationA[myd$Individual=="A"] <- 1

# Calculate relationA
myd$relationA <-   myd$relationA + rowSums(sapply(myd$Individual, function(indiv) 
     myd$relationA[myd$Individual==indiv]/2 * ((myd$P1==indiv) + (myd$P2==indiv))))

Is what you are looking for something like this?

# Initialize values of relationA
myd$relationA <- 0
myd$relationA[myd$Individual=="A"] <- 1


# Iterate over all Individuals
for (indiv in myd$Individual) {

  indiVal <- myd$relationA[myd$Individual==indiv]

  # all columns handled at once, thanks to vectorization;  no need for myd$P1[i]
  myd$relationA <- myd$relationA  + 
                 indiVal/2 * ((myd$P1==indiv) + (myd$P2==indiv))
}

Output

myd
   Individual P1 P2 relationA
1           A  0  0     1.000
2           B  0  0     0.000
3           C  A  B     0.500
4           D  0  0     0.000
5           E  C  D     0.250
6           F  C  E     0.375
7           G  0  0     0.000
8          H1  E  G     0.125
9          H2  E  G     0.125
...

Problem

I am having difficulty executing a calculation that is defined iteratively. The following data serves as an example (actual data set much larger): ``` ## DATA ## # Columns Individual<-c("A","B","C","D","E","F","G","H1","H2","H3","H4","H5","K1","K2","K3","K4","K5") P1<-c(0,0,"A",0,"C","C",0, rep("E",5),"H1","H2","H3","H4","H5") P2<-c(0,0,"B",0,"D", "E",0,rep("G",5),"H1","H2","H3","H4","H5") # Dataframe myd<-data.frame(Individual,P1,P2,stringsAsFactors=FALSE) Individual P1 P2 1 A 0 0 2 B 0 0 3 C A B 4 D 0 0 5 E C D 6 F C E 7 G 0 0 8 H1 E G 9 H2 E G 10 H3 E G 11 H4 E G 12 H5 E G 13 K1 H1 H1 14 K2 H2 H2 15 K3 H3 H3 16 K4 H4 H4 17 K5 H5 H5 ``` The data represents the relationship between and Individual and the two parents, `P1`, `P2`. The calculation required, labeled `relationA`, represents how much each individual is related to A. By definition, the relationship between A and A is given a value of 1. The values for all other individuals need to be computed based on the information in the table, as follows: ``` The value of relationA for an individual should be equal to 1/2 (the value of relationA of P1 of the individual) + 1/2 (the value of relationA of P2 of the individual) ``` FOR EXAMPLE ``` Individual P1 P2 relationA 1 A 0 0 1 2 B 0 0 0 3 C A B (A = 1 + B = 0)/2 = 0.5 4 D 0 0 0 5 E C D (C= 0.5 + D = 0)/2 = 0.25 6 F C E (C = 0.5 + E = 0.25)/2 = 0.375 ``` The expected output is as the following: ``` Individual P1 P2 relationA 1 A 0 0 1 2 B 0 0 0 3 C A B 0.5 4 D 0 0 0 5 E C D 0.25 6 F C E 0.375 7 G 0 0 0 8 H1 E G 0.125 9 H2 E G 0.125 10 H3 E G 0.125 11 H4 E G 0.125 12 H5 E G 0.125 13 K1 H1 H1 0.125 14 K2 H2 H2 0.125 15 K3 H3 H3 0.125 16 K4 H4 H4 0.125 17 K5 H5 H5 0.125 ``` My difficulty is in expressing this in a proper manner in `R`. Any help would be appreciated.

Original source