Условия для сопоставления всех столбцов с одним столбцом - PullRequest
2 голосов
/ 03 июля 2019

У меня есть фрейм данных (df), в котором я хочу сопоставить каждый столбец с последним столбцом, чтобы предоставить новые значения для каждого из этих столбцов.

Вот мой пример фрейма данных (df):

> df
              S1  S2  S3  S4  S5  main
Gene1         1   1   1   1   2   1
Gene2         1   2   1   1   1   1
Gene3         1   1   1   1   2   2
Gene4         2   1   1   1   1   1
Gene5         1   2   1   2   1   1
Gene6         1   1   1   1   1   2
Gene7        NA  NA   2   1   1   1
Gene8         1   2   1   1   1   2
Gene9         2   1   1   2   1   1

Я хочу сопоставить каждый из моих столбцов от 1 до 5 с последним столбцом при следующих условиях.'S' ниже относится к каждому столбцу от 1 до 5.

If S = 2 and main = 2, then value is True Positive (TP)
If S = 2 and main = 1, then value is False Positive (FP)
If S = 1 and main = 2, then value is False Negative (FN)
If S = 1 and main = 1, then value is True Negative (TN)
And NAs to remain as NAs.

И поэтому мой новый фрейм данных (df_updated) должен выглядеть следующим образом.

> df_updated
              S1  S2  S3  S4  S5
Gene1         TN  TN  TN  TN  FP
Gene2         TN  FP  TN  TN  TN
Gene3         FN  FN  FN  FN  TP
Gene4         FP  TN  TN  TN  TN
Gene5         TN  FP  TN  FP  TN
Gene6         FN  FN  FN  FN  FN
Gene7         NA  NA  FP  TN  TN
Gene8         FN  TP  FN  FN  FN
Gene9         FP  TN  TN  FP  TN

Мне известно офункции соответствия, но я не уверен, как их зациклить и использовать указанные выше конкретные соответствия для каждого из столбцов.

Любая помощь приветствуется, спасибо.

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Вы можете использовать dplyr case_when:

library(dplyr)

mutate_all(df, ~case_when(
           .x < main ~ "FN",
           .x > main ~ "FP",
           near(.x, 1) & near(.x, main) ~ "TN",
           near(.x, 2) & near(.x, main) ~ "TP"
           )) %>%
select(-main)
#>     S1   S2 S3 S4 S5
#> 1   TN   TN TN TN FP
#> 2   TN   FP TN TN TN
#> 3   FN   FN FN FN TP
#> 4   FP   TN TN TN TN
#> 5   TN   FP TN FP TN
#> 6   FN   FN FN FN FN
#> 7 <NA> <NA> FP TN TN
#> 8   FN   TP FN FN FN
#> 9   FP   TN TN FP TN
2 голосов
/ 03 июля 2019

Используя базу R, вы также можете создать функцию с вложенным ifelse и применить функцию к каждому столбцу и получить значения.

get_value <- function(x,main) {
 ifelse(main == 2 & x == 2, "TP", 
      ifelse(main == 1 & x == 2, "FP", 
            ifelse(main == 2 & x == 1, "FN", 
                 ifelse(main == 1 & x == 1 ,"TN", NA))))
}

df1 <- df[-ncol(df)]
df1[] <- lapply(df1, get_value, df$main)   

df1
#        S1   S2 S3 S4 S5
#Gene1   TN   TN TN TN FP
#Gene2   TN   FP TN TN TN
#Gene3   FN   FN FN FN TP
#Gene4   FP   TN TN TN TN
#Gene5   TN   FP TN FP TN
#Gene6   FN   FN FN FN FN
#Gene7 <NA> <NA> FP TN TN
#Gene8   FN   TP FN FN FN
#Gene9   FP   TN TN FP TN
...