我在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
分配给最后一列,但它仍然失败。
非常感谢提前!
答案 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)