在R中,我有一個資料框架,其中有一列 "食物",有100多個不同的字串值。
例如:
id< -c("1"/span>。 "2", "3"。 "4",/span> "5"。 "6")
食物 < - c("X1_"。 "X2_", "X3_", "X4_",/span> "X5_"。 "X100_")
df <- data.frame(id, food)
我想根據列 "food "中的字串創建一個新的列 "food_final"。我開始使用嵌套的ifelses和grepl來撰寫代碼,但是考慮到有100多個不同的字串值,我知道有100多個if elses絕對不是最干凈的方法,而且在任何情況下,一個人可以擁有的數量是有限的。
迄今為止我所嘗試的例子:
df$food_final< -ifelse(grepl("X1_"/span>。 df$food,忽略。 case=TRUE), "1",
ifelse(grepl("X2_"。 df$food,忽略。 case=TRUE), "2",
ifelse(grepl("X3_"。 df$food,忽略。 case=TRUE), "3",
ifelse(grepl("X4_"。 df$food,忽略。 case=TRUE), "4",
ifelse(grepl("X5_"。 df$food,忽略。 case=TRUE), "5",
ifelse(grepl("X100_"。 df$food,忽略。 case=TRUE), "100"。 NA))))))
創建這個新列'food_final'的最佳方式是什么,而不是使用這么多嵌套的ifelse陳述句?
預先感謝您。
uj5u.com熱心網友回復:
在sub的幫助下,你也許就可以使用單行解決方案:
df$food_final < - sub("^X(d )_$"。 "1", df$food)
uj5u.com熱心網友回復:
如果你只是想從字串中提取數字,我喜歡使用readr中的parse_number。
df$food_final< -parse_number(df$food)。
uj5u.com熱心網友回復:
如果你想提取數字:
df$food_final < - gsub("D"/span>。 "", 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"/span>="X3_"/span>。 "4"/span>="X4_"/span>。 "5"/span>="X5_"/span>。 "100"="X100_")
apply(sapply(X, grepl, df$food, ignore. case=TRUE), 1。 function(y) names(x)[y]/span>[1])
#[1] "1" "2" "3" "4" "5" "100"
或者使用Reduce:
x < - c("1"=="X1_"。 "2"="X2_"。 "3"/span>="X3_"/span>。 "4"/span>="X4_"/span>。 "5"/span>="X5_"/span>。 "100"="X100_")
Reduce(function(a。 b) {
i <- is.na(a)
a[i][grepl(x[b]。 df$food[i],忽略。 case=TRUE)] <-b
a
}, names(x)。 rep(NA。 nrow(df)))
#[1] "1" "2" "3" "4" "5" "100"
uj5u.com熱心網友回復:
你也可以使用str_extract來只提取數字:
library(stringr)
df$food_final < - str_extract(df$food, "d ")
uj5u.com熱心網友回復:
我們可以使用extract_numeric從tidyr包:
library(dplyr)
library(tidyr)
df %>%。
mutate(final_food = extract_numeric(food))
輸出:
id food final_food
1 1 X1_ 1
2 2 X2_ 2
3 3 X3_ 3
4 4 X4_4
5 5 X5_5
6 6 X100_ 100
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/314484.html
標籤:
