[英]Using match and apply in R
> df = data.frame(id = 1:5, ch_1 = 11:15,ch_2= 10:14,selection = c(11,13,12,14,12))
> df
id ch_1 ch_2 selection
1 1 11 10 11
2 2 12 11 13
3 3 13 12 12
4 4 14 13 14
5 5 15 14 12
鑒於此數據集,我需要一個遵循規則的附加列:
我需要一種方法來為每一行執行此操作。 對於單行,執行以下代碼工作得很好,但我似乎無法找到一種方法將它與apply
一起使用以apply
其運行到數據幀的每一行。尋找可以應用於多個的解決方案只有兩列,運行速度比傳統循環快
df=df[1,]
if (df$selection %in% df[,paste("ch_",1:2,sep="")]) {
a = which(df[,paste("ch_",1:2,sep="")]==df$selection)
} else {
a = 3
}
# OR
ifelse(df$selection %in% df[,paste("ch_",1:2,sep="")],1,3)
# OR
match(df$selection,df[,paste("ch_",1:2,sep="")])
使用==
將向量與其他列進行比較,添加始終為TRUE
的最后一列,然后使用max.col
每行中第一個TRUE
的索引
max.col(cbind(df$selection == df[c("ch_1","ch_2")], TRUE), "first")
#[1] 1 3 2 1 3
這應該很容易擴展到n列。
你可以用嵌套的ifelse
來做到這ifelse
,
with(df, ifelse(selection == ch_1, 1L, ifelse(selection == ch_2, 2L, 3L)))
# [1] 1 3 2 1 3
但我很少喜歡嵌套它們。 如果這就是你所需要的(而且你永遠不需要超過兩個),那么這可能就足夠了。
一種替代方法是使用dplyr::case_when
,
with(df, dplyr::case_when(selection == ch_1 ~ 1, selection == ch_2 ~ 2, TRUE ~ 3))
如果您已經在使用該軟件包,則可以在dplyr::mutate
輕松使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.