我有以下数据帧,df:
Alpha Beta Gamma
1 100 36 Dollar, Euro, Yen
2 120 -33 Euro
3 150 14 Yen, Peso
我有另一个向量,货币 = c("美元"、"日元")
我想生成一个新列,其中列出了:
- 如果"Gamma"包含任何货币元素,则为 1
- 如果"Gamma"不包含货币元素,则为 0
我尝试:
df$Epsilon <- ifelse(any(df$Gamma %in% currency), 1, 0)
但这行不通。 经过仔细检查,df$Gamma 中的每一行都被解释为一个字符串(即,"美元、欧元、日元"而不是"美元"、"欧元"、"日元"),因此 %in% 无法正常工作。
splits = lapply(strsplit(df$Gamma,','), trimws)
完成分解值的工作,但我只能通过使用双括号(即 splits[[i]]])引用它们以与 %in% 进行比较,我无法对列表中的每个值都这样做。
我怎样才能达到我的结果?
transform(dat,yy=grepl(paste0(currencies,collapse="|"),Gamma)+0)
Alpha Beta Gamma yy
1 100 36 Dollar, Euro, Yen 1
2 120 -33 Euro 0
3 150 14 Yen, Peso 1
使用stringr::str_detect
可以实现一种解决方案,如下所示:
library(stringr)
df$Epsilon <- as.numeric(str_detect(df$Gamma, paste(currencies, collapse='|')))
df
# Alpha Beta Gamma Epsilon
# 1 100 36 Dollar, Euro, Yen 1
# 2 120 -33 Euro 0
# 3 150 14 Yen, Peso 1
数据:
df <- read.table(text =
'Alpha Beta Gamma
100 36 "Dollar, Euro, Yen"
120 -33 Euro
150 14 "Yen, Peso"',
header = TRUE, stringsAsFactors = FALSE)
currencies = c("Dollar", "Yen")