zackymo21 zackymo21 - 2 months ago 6
R Question

R: Compare values in a read table and update another matrix

I am currently having a problem utilizing R to compare each column within a specific matrix. I have attempted to compare each of the entire columns at once, and generate a true and false output via the table command, and then convert the number of trues that can be found to a numeric value and input such values in their respective places within the incidence matrix.

For example, I have data in this type of format:
//Example state matrix - I am attempting to compare c1 with c2, then c1 with c3, then c1 with c4 and so on and so forth
c1 c2 c3 c4
r1 2 6 3 2
r2 1 1 6 5
r3 3 1 3 6

And I am trying to instead put it into this format
//Example incidence matrix - Which is how many times c1 equaled c2 in the above matrix
c1 c2 c3 c4
c1 3 1 1 1
c2 1 3 0 0
c3 1 0 3 0
c4 1 0 0 3


Here is the code I have come up with so far, however, I keep getting this particular error --



Warning message:
In IncidenceMat[rat][r] = IncidenceMat[rat][r] + as.numeric(instances) :number of items to replace is not a multiple of replacement length

rawData = read.table("5-14-2014streamW636PPstate.txt")
colnames = names(rawData) #the column names in R
df <- data.frame(rawData)
rats = ncol(rawData)
instances = nrow(rawData)

IncidenceMat = matrix(rep(0, rats), nrow = rats, ncol = rats)

for(rat in rats)
for(r in rats)
if(rat == r){rawData[instance][rat] == rawData[instance][r] something like this would work in C++ if I attempted,
IncidenceMat[rat][r] = IncidenceMat[rat][r] + as.numeric(instances)
} else{
count = df[colnames[rat]] == df[colnames[r]]
c = table(count)
TotTrue = as.numeric(c[2][1])
IncidenceMat[rat][r] = IncidenceMat[rat][r] + TotTrue #count would go here #this should work like a charm as well
}


Any help would be greatly appreciated; I have also looked at some of these resources, however, I am still stumped

I tried this and this along with some other resources I recently closed.

Answer

How about this (note the incidence matrix is symmetric)?

df
   c1 c2 c3 c4
r1  2  6  3  2
r2  1  1  6  5
r3  3  1  3  6

incidence <- matrix(rep(0, ncol(df)*ncol(df)), nrow=ncol(df))
diag(incidence) <- nrow(df)
for (i in 1:(ncol(df)-1)) {
   for (j in (i+1):ncol(df)) {
     incidence[i,j] = incidence[j,i] = sum(df[,i] == df[,j])
   }
}

incidence
     [,1] [,2] [,3] [,4]
[1,]    3    1    1    1
[2,]    1    3    0    0
[3,]    1    0    3    0
[4,]    1    0    0    3