(Пирсона) корреляция l oop через фрейм данных - PullRequest
0 голосов
/ 21 марта 2020

У меня есть фрейм данных с 159 obs и 27 переменными, и я хочу сопоставить все 159 obs из столбца 4 (переменная 4) с каждым из следующих столбцов (переменных), то есть сопоставить столбец 4 с 5, затем столбец 4 с 6 и так далее ... Я безуспешно пытался создать al oop, и, поскольку я новичок в R, все оказалось сложнее, чем я думал. Причина, по которой я хочу сделать это более простым, заключается в том, что мне нужно было бы сделать то же самое для пары дополнительных фреймов данных, и если бы у меня была функция, которая могла бы это сделать, это было бы намного проще и занимало бы меньше времени. Таким образом, было бы замечательно, если бы кто-нибудь мог мне помочь.

 df <- ZEB1_23genes # CHANGE ZEB1_23genes for df (dataframe)

  for (i in colnames(df)){      # Check the class of the variables
         print(class(df[[i]]))
  }

print(df)

# Correlate ZEB1 with each of the 23 genes accordingly to Pearson's method


cor.test(df$ZEB1, df$PITPNC1, method = "pearson")
### OR ###
cor.test(df[,4], df[,5])

Так что я могу сопоставить индивидуально, но я не могу создать все значения от oop до go к столбцу 4 и сопоставить его со следующим столбцом ( 5, 6, ..., 27).

Спасибо!

1 Ответ

1 голос
/ 21 марта 2020

Если я правильно понял ваш вопрос, приведенное ниже решение должно работать хорошо.

#Sample data
df <- data.frame(matrix(data = sample(runif(100000), 4293), nrow = 159, ncol = 27))

#Correlation function
#Takes data.frame contains columns with values to be correlated as input
#The column against which other columns must be correlated cab be specified (start_col; default is 4)
#The number of columns to be correlated against start_col can also be specified (end_col; default is all columns after start_col)
#Function returns a data.frame containing start_col, end_col, and correlation value as rows.

my_correlator <- function(mydf, start_col = 4, end_col = 0){
    if(end_col == 0){
    end_col <- ncol(mydf)
  }
  #out_corr_df <- data.frame(start_col = c(), end_col = c(), corr_val = c())
  out_corr <- list()
  for(i in (start_col+1):end_col){
    out_corr[[i]] <- data.frame(start_col = start_col, end_col = i, corr_val = as.numeric(cor.test(mydf[, start_col], mydf[, i])$estimate))
  }
  return(do.call("rbind", out_corr))
}

test_run <- my_correlator(df, 4)

head(test_run)

#   start_col end_col     corr_val
# 1         4       5 -0.027508521
# 2         4       6  0.100414199
# 3         4       7  0.036648608
# 4         4       8 -0.050845418
# 5         4       9 -0.003625019
# 6         4      10 -0.058172227

Функция в основном принимает data.frame в качестве входа и выплевывает (в качестве вывода) еще один data.frame содержит корреляции между данным столбцом из исходного data.frame и всеми последующими столбцами. Я не знаю структуру ваших данных, и, очевидно, эта функция не будет работать, если она столкнется с непредвиденными условиями (например, столбец символов в одном из столбцов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...