R 将所有列与一列匹配的条件
我有一个数据框(df),其中我希望将每一列与最后一列相匹配,以便为每一列提供新的值 以下是我的示例数据帧(df): 我想将我从1到5的每一列与具有以下条件的最后一列相匹配。”下面的“S”表示从1到5的每一列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
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