如果其他人没有';t在R中的数据帧中工作
我有一个关于如果其他人没有';t在R中的数据帧中工作,r,dataframe,R,Dataframe,我有一个关于R中data.frame中的ifelse的问题。我查看了几篇关于它的帖子,不幸的是,这些解决方案都不适合我的情况 我的情况是,在数据帧中进行条件计算,但它返回该条件的长度大于1,并且即使在我使用R中的ifelse函数后,也只会使用第一个元素,根据我检查的SO帖子,该函数应该可以很好地工作 以下是我的示例代码: library(scales) head(temp[, 2:3]) previous current 1 0 10 2 50
R
中data.frame
中的ifelse
的问题。我查看了几篇关于它的帖子,不幸的是,这些解决方案都不适合我的情况
我的情况是,在数据帧中进行条件计算,但它返回该条件的长度大于1,并且即使在我使用R
中的ifelse
函数后,也只会使用第一个元素
,根据我检查的SO帖子,该函数应该可以很好地工作
以下是我的示例代码:
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
one,我将得到以下结果:
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%
所以我的问题是,我应该如何应对?在运行ifelse
之前,我尝试将0
分配到最后一列,但仍然失败
非常感谢 仅计算
值
中的第一个元素。因此,rate
的输出仅取决于temp
的第一行 仅计算值
中的第一个元素。因此,rate
的输出仅取决于temp
的第一行 还有另一种方法可以做到这一点
# 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
#一个tible:6 x 3
以前的当前更改
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: 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
#一个tible:6 x 3
以前的当前更改
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
尝试以下两个部分,它们都可以满足您的需要。也许这是你要找的第二个
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))
库(比例)
种子(1)
temp尝试以下两个部分,这两个部分都可以满足您的需要。也许这是你要找的第二个
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))
库(比例)
种子(1)
temp采纳了热心用户给我的建议,所以我将我的一些功能矢量化了,它成功了!为我们的社区举杯
以下是解决方案:
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
。如果需要“常规”符号,则更新如下:
temp$rate = format(temp$rate, scientific = F)
采纳了热心用户的建议,我对一些功能进行了矢量化,效果很好!为我们的社区举杯
以下是解决方案:
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
。如果需要“常规”符号,则更新如下:
temp$rate = format(temp$rate, scientific = F)
您使用的是if
else
语句,而不是ifelse
function@bouncyball如果
和其他
仅用于费率
..BigD,@bounchball是对的。调用ifelse时,temp$previous
的第一个值,即temp$previous[1]
为0,因此条件temp$previous>0
为false,代码将调用rate
函数。出现错误的是rate
。在rate
中,如果(值>1),则代码位为但值是向量,而不是标量if
只处理标量逻辑条件,因此您会收到警告消息。@G5W请稍等。。在第一种情况下,它应该运行temp$current
而不是rate
one。对于第二种情况,previous[2]
大于0,因此它将运行rate
,在这种情况下值实际上是一个标量。我在模拟过程中犯了一些错误吗?我认为你误解了论点的含义。请查看?ifelse
。第一个参数是条件。第二个参数是当条件为true时要分配的值。第三个参数是当条件为false时要分配的值。对于第一行,条件为false,因此它尝试分配第三个参数,该参数需要调用rate函数。您使用的是if
else
语句,而不是ifelse
function@bouncyball如果
和其他
仅用于费率
..BigD,@bounchball是对的。调用ifelse时,temp$previous
的第一个值,即temp$previous[1]
为0,因此条件temp$previous>0
为false,代码将调用rate
函数。出现错误的是rate
。在rate
中,如果(值>1),则代码位为但值是向量,而不是标量if
只处理标量逻辑条件,因此您会收到警告消息。@G5W请稍等。。在第一种情况下,它应该运行temp$current
而不是rate
one。对于第二种情况,previous[2]
大于0,因此它将运行rate
,在这种情况下值实际上是一个标量。我在模拟过程中犯了一些错误吗?我认为你误解了论点的含义。请查看?ifelse
。第一个参数是条件。第二个参数是当条件为true时要分配的值。第三个参数是当条件为false时要分配的值。对于第一行,条件为false,因此它尝试分配第三个参数,这需要调用rate函数。所以这里有一个后续问题:我应该如何改进这个案例。将速率
功能矢量化。2.ifelse
不能按您使用的方式使用,请子集temp
,然后执行您需要执行的操作。3.从您的问题来看,当ifelse
变为真或假时,您似乎没有得到该部分