我有一个数据帧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发布于 2021-11-01 11:37:21
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 1df[,-1]是比较我们需要的列的一种方法;我们也可以使用df[,2:5]或其他几种列选择工具之一。如果在vec中找到特定元素,
sapply(...)将返回一个逻辑矩阵:sapply(df,-1,%in%,vec) # mp1 mp2 mp3 mp4 # 1,FALSE TRUE TRUE FALSE # 2,FALSE # 3,TRUE 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))发布于 2021-11-01 12:02:37
base R中的替代解决方案
f <- function(x) 1 * (sum(is.na(match(vec, x))) < 3)
df <- cbind(df, dec = apply(df, 1, f))https://stackoverflow.com/questions/69796374
复制相似问题