如何一起使用 lapply 和 ifelse 但在 R 中的 df 中保留原始值

How to use lapply and ifelse together but keep original values in the df in R

我有一个带有数字间隔的 df,我想用 'BETWEEN' 和 'AND' 将数字分开(稍后在 sqldf 中使用)

t <- data.frame('id'=c(1:5), 'values'=c("1-1000", ">12", "2-2000", "<100", "5-10"), 'more values' =c(">50", "<10", "500-2000", "1-10", ">100") )

我将 lapply 函数与 ifelse 一起使用,它可以工作,但是,在 table 的其余部分,所有值不包含“-”的单元格现在都替换为单个数字,例如“1”或“2”。我希望保留原始值(例如 >12。<100 等)。

#with grepl
t[] <- lapply(t, function(x) ifelse(grepl('-', x), paste('BETWEEN', sub("\-.*", "", x), 'AND', sub('.*-', '', x)  ), x))

#with %like%
t[] <- lapply(t, function(x) if(x %like% '-') {paste('BETWEEN', sub("\-.*", "", x), 'AND', sub('.*-', '', x))})

我也试过用if no else函数,但是没有解决问题

t[] <- lapply(t, function(x) if(grepl('-', x)) {paste('BETWEEN', sub("\-.*", "", x), 'AND', sub('.*-', '', x))})

期望的输出:

t1 <- data.frame('id'=c(1:5), 'values'=c("BETWEEN 1 AND 1000", ">12", "BETWEEN 2 AND 2000", "<100", "BETWEEN 5 AND 10"), 'more values' =c(">50", "<10", "BETWEEN 500 AND 2000", "BETWEEN 1 AND 10", ">100") )

提前致谢!

您可以将 ifelsegreplsub 一起使用:

t[-1] <- lapply(t[-1], function(x) 
         ifelse(grepl('-', x), paste0('BETWEEN ', sub('-', ' AND ', x)), x))
t
#  id             values          more.values
#1  1 BETWEEN 1 AND 1000                  >50
#2  2                >12                  <10
#3  3 BETWEEN 2 AND 2000 BETWEEN 500 AND 2000
#4  4               <100     BETWEEN 1 AND 10
#5  5   BETWEEN 5 AND 10                 >100

我们使用 grepl 识别其中包含 "-" 的字符串并添加 "BETWEEN " 并将 "-" 替换为 " AND "。我们保持其他字符串不变。