ifelse()仅评估匹配的行

时间:2018-12-03 16:36:02

标签: r dplyr

我有一个带有特殊列a的data.frame。此列可以是数字,也可以是告诉我查看列b的SPECIAL值。

foo <- tibble(
  a=c("15", "20", "SPECIAL", "13"),
  b=c(NA, NA, 32, NA)
)

如果我可以使用dplyr

进行转换,那就太好了
foo %>%
  mutate(
    a=ifelse(a == "SPECIAL",
             b,
             as.numeric(a)
      )
  )

看起来不错,阅读也不错。不幸的是,ifelse(test, yes, no)同时评估了yesno参数。当然,as.numeric(a)会警告SPECIAL

ifelse是否有其他选择可以首先自动拆分data.frame?我想避免评估as.numeric(a)

注意:进行编辑以使问题更清楚

2 个答案:

答案 0 :(得分:1)

tidyr::separate将在这里工作

foo <- tibble(
  a=c("15", "20", "3x10", "13")
)

foo %>%
  separate(a, into = c("a", "new_col"), sep = "x")

# A tibble: 4 x 2
  a     new_col
  <chr> <chr>  
1 15    NA     
2 20    NA     
3 3     10     
4 13    NA 

答案 1 :(得分:0)

sapply(strsplit(foo$a, "x"), function(x) {prod(as.numeric(x))})

dplyr::语法:

foo %>%
    mutate( a = sapply(strsplit(a, "x"), function(x) {prod(as.numeric(x))}) )

# A tibble: 4 x 1
#      a
#  <dbl>
#1    15
#2    20
#3    30
#4    13