R 将所有列与一列匹配的条件

R 将所有列与一列匹配的条件,r,dataframe,match,col,R,Dataframe,Match,Col,我有一个数据框(df),其中我希望将每一列与最后一列相匹配,以便为每一列提供新的值 以下是我的示例数据帧(df): 我想将我从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

我有一个数据框(df),其中我希望将每一列与最后一列相匹配,以便为每一列提供新的值

以下是我的示例数据帧(df):

我想将我从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_更新)应该是这样的

> 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
我知道匹配函数,但我不确定如何循环它们,以及如何为每一列使用上述特定匹配

感谢您的帮助,
谢谢。

您可以在下列情况下使用dplyr的
案例:

库(dplyr)
变异所有(df,~case_)(
.xmain~“FP”,
近(.x,1)和近(.x,main)~“TN”,
近(.x,2)和近(.x,main)~“TP”
)) %>%
选择(-main)
#>S1 S2 S3 S4 S5
#>1 TN FP
#>2 TN FP TN
#>3 FN FN FN FN TP
#>4 FP TN
#>5 TN FP TN FP TN
#>6 FN FN FN FN FN
#>7 FP TN
#>8 FN TP FN FN FN FN
#>9英尺-英尺-英尺-英尺-英尺

使用base 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

get_value非常感谢。这很有效。如果我想让row.names也存在,那么我可以添加row.names=T吗?您还可以使用
mutate_at(vars(matches)(“S”),…)
因此,在排除列之前,您不会更新列
main
。对于行名称,您可以添加基因名称作为第一列,并使用@AntoniosK的建议,而不是
mutate\u all
df[1:5]谢谢@Ronak。这也很有效,对我来说是很好的学习。在发布我的问题之前,我考虑了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