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
-
逻辑,当求和时,转换为整数,FALSE 为 0,TRUE 为 1,所以你的逻辑 “一个或多个” 意味着一行的总和大于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))