首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中使用grepl减少嵌套if with语句

问在R中使用grepl减少嵌套if with语句
EN

Stack Overflow用户
提问于 2021-09-14 11:12:13
回答 5查看 125关注 0票数 1

在R中,我有一个数据框架,它有一个列“food”,其中包含不同的100+字符串值。

例如:

代码语言:javascript
复制
id<-c("1", "2", "3", "4", "5", "6")
food <- c("X1_", "X2_", "X3_", "X4_", "X5_", "X100_")
df <- data.frame(id, food)

我想根据列‘food_final’中的字符串创建一个新的列‘’。我开始使用嵌套的ifelses和grepl编写代码,但是考虑到有不同的字符串值,我知道如果100+不是最干净的方法,那么就拥有100+,而且在任何情况下,都有一个限制。

我试过的例子如下:

代码语言:javascript
复制
df$food_final<-ifelse(grepl("X1_", df$food, ignore.case=TRUE), "1",
                      ifelse(grepl("X2_", df$food, ignore.case=TRUE), "2",
                             ifelse(grepl("X3_", df$food, ignore.case=TRUE), "3",
                                    ifelse(grepl("X4_", df$food, ignore.case=TRUE), "4",
                                        ifelse(grepl("X5_", df$food, ignore.case=TRUE), "5",
                                             ifelse(grepl("X100_", df$food, ignore.case=TRUE), "100", NA))))))

创建这个新列'food_final‘的最佳方法是什么,而不是使用这么多嵌套的ifelse语句?

提前谢谢你。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-09-14 11:18:38

如果您想提取数字:

代码语言:javascript
复制
df$food_final <- gsub("\\D", "", df$food)

df
#  id  food food_final
#1  1   X1_          1
#2  2   X2_          2
#3  3   X3_          3
#4  4   X4_          4
#5  5   X5_          5
#6  6 X100_        100

或者,如果有不同的链接,基本上与您使用嵌套ifelse所做的相同。

代码语言:javascript
复制
x <- c("1"="X1_", "2"="X2_", "3"="X3_", "4"="X4_", "5"="X5_", "100"="X100_")
apply(sapply(x, grepl, df$food, ignore.case=TRUE), 1, function(y) names(x)[y][1])
#[1] "1"   "2"   "3"   "4"   "5"   "100"

或者使用Reduce

代码语言:javascript
复制
x <- c("1"="X1_", "2"="X2_", "3"="X3_", "4"="X4_", "5"="X5_", "100"="X100_")
Reduce(function(a,b) {
  i <- is.na(a)
  a[i][grepl(x[b], df$food[i], ignore.case=TRUE)] <- b
  a
}, names(x), rep(NA, nrow(df)))
#[1] "1"   "2"   "3"   "4"   "5"   "100"
票数 1
EN

Stack Overflow用户

发布于 2021-09-14 11:15:15

您可以在sub的帮助下使用单行解决方案。

代码语言:javascript
复制
df$food_final <- sub("^X(\\d+)_$", "\\1", df$food)
票数 2
EN

Stack Overflow用户

发布于 2021-09-14 11:19:12

如果您只是试图从字符串中提取数字,我喜欢从readr中使用readr。

代码语言:javascript
复制
df$food_final<-parse_number(df$food)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69176690

复制
相关文章

相似问题

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