评估数据框内的表达式

我的数据框如下所示:

df <- data.frame(Name=c("John","Paul","Bob"), Age=c("20","30_&_5","40"))

  Name    Age
1 John     20
2 Paul 30_&_5
3  Bob     40

在“年龄”(Age)列中,有时需要执行一个操作(请参见第2行,其中“&”可以理解为“ +”),以便获得:

  Name    Age
1 John     20
2 Paul     35
3  Bob     40

我试过的

library(stringr)

ifelse(
    str_detect(df$Age, "[[:digit:]]+_[+]_[[:digit:]]+"),
    {
        df$Age <- as.character(df$Age)
        new_age <- unlist(strsplit(df$Age,"_"))
        as.numeric(new_age[1]) + as.numeric(new_age[3])
    },
    df$Age
)

[1] "20" NA   "40"

Warning message:
In ifelse(str_detect(df$Age, "[[:digit:]]+_[+]_[[:digit:]]+"), { :
  NAs introduced by coercion

但是,当我删除第一行时,代码将按预期工作。

评论
  • zvelit
    zvelit 回复

    One way is to use eval(parse(...)), i.e.

    df$Age[grepl('_+_', df$A, fixed = TRUE)] <- eval(parse(text = gsub('_', '', df$A)))
    
    #  Name Age
    #1 John  20
    #2 Paul  40
    #3  Bob  40