首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字符向量与数据帧匹配并添加新列

将字符向量与数据帧匹配并添加新列
EN

Stack Overflow用户
提问于 2021-11-01 11:35:03
回答 2查看 36关注 0票数 0

我有一个数据帧df

代码语言:javascript
运行
复制
ID mp1 mp2 mp3 mp4
C1 25 28 32 37
C2 24 45 38 0
C3 28 33 24 20

一个字符向量:

代码语言:javascript
运行
复制
vec = c('32','35','28')

我希望将字符向量的vec值与数据帧df进行匹配,例如,如果有一个或多个值匹配,则添加一个包含01的新列(O表示不匹配,1表示匹配)

代码语言:javascript
运行
复制
ID mp1 mp2 mp3 mp4 dec
C1 25 28 32 37 1
C2 24 45 38 0 0
C3 28 33 24 20 1
EN

回答 2

Stack Overflow用户

发布于 2021-11-01 11:37:21

代码语言:javascript
运行
复制
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]或其他几种列选择工具之一。

如果在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

  • +(...)是将逻辑值转换为它们的整数等价项的技巧(类似于前面的项目符号)。

数据

代码语言:javascript
运行
复制
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))
票数 0
EN

Stack Overflow用户

发布于 2021-11-01 12:02:37

base R中的替代解决方案

代码语言:javascript
运行
复制
f <- function(x) 1 * (sum(is.na(match(vec, x))) < 3)

df <- cbind(df, dec = apply(df, 1, f))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69796374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档