我有一個資料框df;
ID mp1 mp2 mp3 mp4
C1 25 28 32 37
C2 24 45 38 0
C3 28 33 24 20
一個字符向量:
vec = c('32','35','28')
并且我想將字符向vec量值與資料框df匹配,例如如果一個或多個值匹配,則添加一個包含0和的新列1(O用于不匹配和1匹配)
ID mp1 mp2 mp3 mp4 dec
C1 25 28 32 37 1
C2 24 45 38 0 0
C3 28 33 24 20 1
uj5u.com熱心網友回復:
df$dec <- (rowSums(sapply(df[,-1], `%in%`, vec)) > 0)
df
# ID mp1 mp2 mp3 mp4 dec
# 1 C1 25 28 32 37 1
# 2 C2 24 45 38 0 0
# 3 C3 28 33 24 20 1
df[,-1]是一種只比較我們需要的列的方法;我們也可以使用df[,2:5]其他幾種列選擇工具之一??。sapply(...)如果在 中找到特定元素,則回傳邏輯矩陣vec:sapply(df[,-1], `%in%`, vec) # mp1 mp2 mp3 mp4 # [1,] FALSE TRUE TRUE FALSE # [2,] FALSE FALSE FALSE FALSE # [3,] TRUE FALSE FALSE FALSE邏輯,當求和時,轉換為
FALSE0 和TRUE1 的整數,所以你的“一個或多個”邏輯意味著跨行的總和大于 0:rowSums(sapply(df[,-1], `%in%`, vec)) > 0 # [1] TRUE FALSE TRUE(...)是將邏輯轉換為其整數等效項的技巧(類似于上一個專案符號)。
資料
df <- structure(list(ID = c("C1", "C2", "C3"), mp1 = c("25", "24", "28"), mp2 = c("28", "45", "33"), mp3 = c("32", "38", "24"), mp4 = c("37", "0", "20")), class = "data.frame", row.names = c(NA, -3L))
uj5u.com熱心網友回復:
base 中的替代解決方案R:
f <- function(x) 1 * (sum(is.na(match(vec, x))) < 3)
df <- cbind(df, dec = apply(df, 1, f))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/343668.html
