ifelse在R中的数据框架中没有工作

时间:2017-06-29 18:03:47

标签: r dataframe

我在ifelse的{​​{1}}中有data.frame的问题。我检查了几个关于它的SO帖子,不幸的是这些解决方案都没有适合我的情况。

我的情况是,在数据框中进行条件计算,但即使我在R中使用了the condition has length > 1 and only the first element will be used函数,它也会返回ifelse,这应该完全根据SO帖子工作我查了一下。

以下是我的示例代码:

R

因此,如果我运行library(scales) head(temp[, 2:3]) previous current 1 0 10 2 50 57 3 92 177 4 84 153 5 30 68 6 162 341 temp$change = ifelse(temp$previous > 0, rate(temp$previous, temp$current), temp$current) rate = function(yest, tod){ value = tod/yest if(value>1){ return(paste("+", percent(value-1), sep = "")) } else{ return(paste("-", percent(1-value), sep = "")) } } ,我将得到以下结果:

ifelse

所以我的问题是,我应该如何处理它?在我运行head(temp[, 2:4]) previous current change 1 0 10 10 2 50 57 +NaN% 3 92 177 +NaN% 4 84 153 +NaN% 5 30 68 +NaN% 6 162 341 +NaN% 之前,我尝试将0分配给最后一列,但它仍然失败。

非常感谢提前!

4 个答案:

答案 0 :(得分:1)

这是另一种做同样的方式

# 1: load dplyr
#if needed install.packages("dplyr")
library(dplyr)

# 2: I recreate your data
your_dataframe = as_tibble(cbind(c(0,50,92,84,30,162),
                                 c(10,57,177,153,68,341))) %>% 
  rename(previous = V1, current = V2)

# 3: obtain the change using your conditions
your_dataframe %>% 
  mutate(change = ifelse(previous > 0,
                         ifelse(current/previous > 1,
                                paste0("+%", (current/previous-1)*100),
                                paste0("-%", (current/previous-1)*100)), 
                         current))

结果:

# A tibble: 6 x 3
  previous current             change
     <dbl>   <dbl>              <chr>
1        0      10                 10
2       50      57               +%14
3       92     177 +%92.3913043478261
4       84     153 +%82.1428571428571
5       30      68 +%126.666666666667
6      162     341 +%110.493827160494

答案 1 :(得分:1)

尝试以下两个细分,两者都应该做你想要的。可能是你要找的第二个。

library(scales)
set.seed(1)
temp <- data.frame(previous = rnorm(5), current = rnorm(5))
rate <- function(i) {
  yest <- temp$previous[i] 
  tod <- temp$current[i]
  if (yest <= 0)
    return(tod)
  value = tod/yest
 if (value>1) {
   return(paste("+", percent(value-1), sep = ""))
 } else {
   return(paste("-", percent(1-value), sep = ""))
 }
}

temp$change <- unlist(lapply(1:dim(temp)[1], rate))

第二

ind <- which(temp$previous > 0)
temp$change <- temp$current
temp$change[ind] <- unlist(lapply(ind, 
                      function(i)  rate(temp$previous[i], temp$current[i])))

在第二段中,函数rate与您编码的函数相同。

答案 2 :(得分:0)

仅评估value中的第一个元素。因此,rate的输出完全取决于temp的第一行。

答案 3 :(得分:0)

采用热心的SO用户提供的建议,我实现了一些功能,并且有效!向SO社区筹集一杯!

以下是解决方案:

temp$rate = ifelse(temp$previous > 0, ifelse(temp$current/temp$previous > 1, 
                                             temp$current/temp$previous - 1, 
                                             1 - temp$current/temp$previous), 
                   temp$current)

这将以科学记数法返回rate。如果&#34;定期&#34;需要表示法,这是一个更新:

temp$rate = format(temp$rate, scientific = F)