簡體   English   中英

在 R 中使用匹配和應用

[英]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

鑒於此數據集,我需要一個遵循規則的附加列:

  1. 如果選擇是兩個選擇(ch_1 和 ch_2)之一,則返回選擇的編號(1 或 2)
  2. 如果選擇不是兩個選擇中的,則返回 3

我需要一種方法來為每一行執行此操作。 對於單行,執行以下代碼工作得很好,但我似乎無法找到一種方法將它與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM