在R中,我有一个数据框架,它有一个列“food”,其中包含不同的100+字符串值。
例如:
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+,而且在任何情况下,都有一个限制。
我试过的例子如下:
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语句?
提前谢谢你。
发布于 2021-09-14 11:18:38
如果您想提取数字:
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所做的相同。
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
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"发布于 2021-09-14 11:15:15
您可以在sub的帮助下使用单行解决方案。
df$food_final <- sub("^X(\\d+)_$", "\\1", df$food)发布于 2021-09-14 11:19:12
如果您只是试图从字符串中提取数字,我喜欢从readr中使用readr。
df$food_final<-parse_number(df$food)https://stackoverflow.com/questions/69176690
复制相似问题