【问题标题】:Test if dataframe column contains any elements of vector测试数据框列是否包含向量的任何元素
【发布时间】:2018-04-08 20:57:23
【问题描述】:

我有以下数据框,df:

    Alpha      Beta     Gamma
1     100       36      Dollar, Euro, Yen
2     120      -33      Euro
3     150       14      Yen, Peso

我还有另一个向量,currency = c("Dollar", "Yen")

我想生成一个新列,列出:

  • 1 如果“Gamma”包含货币的任何元素
  • 如果“Gamma”不包含货币元素,则为 0

我试试:

df$Epsilon <- ifelse(any(df$Gamma %in% currency), 1, 0)

但这不起作用。仔细检查后,df$Gamma 中的每一行都被解释为 一个 字符串,(即“Dollar, Euro, Yen”而不是“Dollar”、“Euro”、“Yen”),所以 % in% 无法正常工作。

splits = lapply(strsplit(df$Gamma,','), trimws)

确实可以分解值,但我只能通过使用双括号(即 splits[[i]]])来引用它们以与 %in% 进行比较,而我不能对 in 中的每个值都这样做列表。

我怎样才能达到我的效果?

【问题讨论】:

  • 我认为strsplit 选项将是最安全的,以防一种货币包含在另一种货币中,例如“dollar”和“dolarydoos”(官方澳元)。 - sapply(strsplit(df$Gamma, ",\\s+"), function(x) any(currencies %in% x)) 或类似的。

标签: r vector compare


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    使用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")
    

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多