Для цикла, выполняемого только в течение последней итерации при создании новой таблицы сопряженности - PullRequest
0 голосов
/ 26 марта 2019

Мой цикл for, который я создал, рассчитывает ожидаемое значение по наблюдаемым значениям и сохраняет его в новой таблице непредвиденных обстоятельств (дубликат, который я сделал ранее). Чтобы рассчитать ожидаемое, вы умножаете сумму строки и сумму столбцов на сумму.

Я создал цикл for, вложенный в другой цикл for, который проходит через наблюдаемую таблицу непредвиденных обстоятельств и вычисляет ожидаемое значение, затем сохраняет его в новой ожидаемой таблице, однако при выполнении кода он вычисляет только последнюю итерацию или из данных [3,3].

The observed table w added margins:
              Frequently Never Rarely  Sum
  Conservative         15   214     47  276
  Liberal             119   479    173  771
  Other                85   172     45  302
  Sum                 219   865    265 1349
The expected table:

               Frequently Never Rarely
  Conservative         15   214     47
  Liberal             119   479    173
  Other                85   172     45

viewsandpot - это данные, которые я назвал, я уже прочитал в виде файла (так что это таблица).

expecteddata <- function(rawdata){
  observedtable <- table(factor(rawdata[,2]), factor(rawdata[,1]))
  observedtable <- addmargins(observedtable)
  expectedtable <- observedtable
  i <- 1
  j <- 1
  ncol <- ncol(observedtable)
  nrow <- nrow(observedtable)
  for(i in nrow-1){
    j <- 1
    for(j in ncol-1){
      expectedtable[i,j] <- (observedtable[i, ncol]*observedtable[nrow, j])/observedtable[ncol, nrow]
      j <- j+1
    }
  }
  return(expectedtable)
}
expecteddata(viewsandpot)

Таблица ожидаемых значений должна быть похожа на наблюдаемый счет, но заменена на вычисленные значения (числа должны отличаться).

Работает только последняя итерация - результат, полученный из кода:

             Frequently     Never    Rarely
  Conservative   15.00000 214.00000  47.00000
  Liberal       119.00000 479.00000 173.00000
  Other          85.00000 172.00000  59.32543

Итак, 59,325 - это единственное другое число.

Не уверен, почему циклы не работают, учитывая, что внутренний цикл for сначала заменяет весь первый ряд, а затем переходит к следующему ряду.

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я думаю, я наконец-то получил его, надеюсь, это ваше желаемое решение:

Frequently <- c(15, 119, 85) #a vector 
Never <- c(214, 479, 172)
Rarely <- c(47, 173, 45)
#setting the observedtable to use later in the function as a data frame
data <- data.frame(Frequently, Never, Rarely, row.names = c("Conservative", "liberal", "other"))

expecteddata <- function(rawdata) {
  #make table to use with the dataframes first, second and third column
  observedtable <-matrix(data = c(rawdata[,1], rawdata[,2], rawdata[,3]), ncol=3)
  #make sum of rows and columns
  observedtable <- addmargins(observedtable)
  #make a dummy expectedtable with values from 1 to 9
  expectedtable <- matrix(1:9, ncol = 3)
  #sets the names of the columns and rows:
  colnames(expectedtable) <- c("Frequently", "Never", "Rarely")
  rownames(expectedtable) <- c("Conservative", "Liberal", "Other")

  ncol <- ncol(observedtable)
  nrow <- nrow(observedtable)            
  total <- observedtable[nrow, ncol]
  for (i in 1:(nrow - 1)) { #what you did was a for each loop of one item here its in the range of 1 to nrow-1 (range is always in r from:to)
    for (j in 1:(ncol - 1)) { #you dont have to set j for every outer loop =1 does it automatically
      rowSum <- observedtable[i, ncol]
      colSum <- observedtable[nrow, j]
      expectedtable[i, j] <- (rowSum * colSum) / total
    }
  }
  return(expectedtable)
}
print(expecteddata(data))

Это вывод:

             Frequently    Never    Rarely
Conservative   44.80652 176.9755  54.21794
Liberal       125.16605 494.3773 151.45663
Other          49.02743 193.6471  59.32543
0 голосов
/ 26 марта 2019
# Dummy data
Conservative = c(15, 214, 47)
Liberal = c(119, 479, 173)
Other = c(85, 172, 45)
df = data.frame(Conservative,Liberal,Other)
df = as.data.frame(t(df))
names = c("Frequently", "Never", "Rarely")
colnames(df) <- names

# sums 
df$row_sum = rowSums(df)
colsum = colSums(df)
df = rbind(df,colsum)
row.names(df) = c("Conservative", "Liberal", "Other", "colsum" )


# Create custom iterator index's
col_index = c(1,2,3)
col_index = rep(col_index,3) # rep 3 times 
row_index = c(1,2,3)
row_index = rep(row_index, each=3) # rep each number total of 3 times

# Loop to calculate the output (rowsum * colsum) / total 
out = as.data.frame(matrix(vector(mode = 'numeric',length = 9), nrow = 3, ncol = 3))  # initialize output
for (i in 1:length(row_index)) { # iterate the length of the custom iteration index vectors 
  out[row_index[i],col_index[i]] = (df[4,col_index[i]] * df[row_index[i],4]) / df[4,4]
} 

Для вывода

> out
         V1       V2        V3
1  44.80652 176.9755  54.21794
2 125.16605 494.3773 151.45663
3  49.02743 193.6471  59.32543
...