Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果其他人没有';t在R中的数据帧中工作_R_Dataframe - Fatal编程技术网

如果其他人没有';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
变为真或假时,您似乎没有得到该部分