Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
R 使用带ifelse条件的mutate时的排序问题_R_If Statement_Dplyr_Mutate - Fatal编程技术网

R 使用带ifelse条件的mutate时的排序问题

R 使用带ifelse条件的mutate时的排序问题,r,if-statement,dplyr,mutate,R,If Statement,Dplyr,Mutate,我试图使用mutate创建一个列,将一列的值取到一个点,然后使用cumprod根据另一列的值填充其余的观察值 我尝试将mutate与ifelse组合,但语句的顺序不正确,我也不知道为什么 下面我重现了一个更基本的例子,它再现了我的问题: foo1 <- data.frame(date=seq(2005,2018,1)) foo1 %>% mutate(h=ifelse(date>2008, seq(1,11,1), 99)) 我希望它是: date h 1 2005

我试图使用mutate创建一个列,将一列的值取到一个点,然后使用
cumprod
根据另一列的值填充其余的观察值

我尝试将
mutate
ifelse
组合,但语句的顺序不正确,我也不知道为什么

下面我重现了一个更基本的例子,它再现了我的问题:

foo1 <- data.frame(date=seq(2005,2018,1))
foo1 %>% mutate(h=ifelse(date>2008, seq(1,11,1), 99))
我希望它是:

   date  h
1  2005 99
2  2006 99
3  2007 99
4  2008 99
5  2009  1
6  2010  2
7  2011  3
8  2012  4
9  2013  5
10 2014  6
11 2015  7
12 2016  8
13 2017  9
14 2018 10
  date a    b       h
1 2005 1 1.01 1.00000
2 2006 2 1.01 2.00000
3 2007 3 1.01 3.00000
4 2008 4 1.01 4.00000
5 2009 5 1.01 5.00000
6 2010 6 1.01 5.05000
7 2011 7 1.01 5.10050
8 2012 8 1.01 5.20302
9 2013 9 1.01 5.25505
编辑:

下面我复制另一个例子(更接近我要做的)

我希望它是:

   date  h
1  2005 99
2  2006 99
3  2007 99
4  2008 99
5  2009  1
6  2010  2
7  2011  3
8  2012  4
9  2013  5
10 2014  6
11 2015  7
12 2016  8
13 2017  9
14 2018 10
  date a    b       h
1 2005 1 1.01 1.00000
2 2006 2 1.01 2.00000
3 2007 3 1.01 3.00000
4 2008 4 1.01 4.00000
5 2009 5 1.01 5.00000
6 2010 6 1.01 5.05000
7 2011 7 1.01 5.10050
8 2012 8 1.01 5.20302
9 2013 9 1.01 5.25505
如果我使用If_else而不是
ifelse
,我会收到以下错误:

Error in mutate_impl(.data, dots) : 
  Evaluation error: `true` must be length 9 (length of `condition`) or one, not 6
你就快到了:

foo1 %>% mutate(h = if_else(date > 2008, cumsum(date > 2008), 99L))
#   date  h
#1  2005 99
#2  2006 99
#3  2007 99
#4  2008 99
#5  2009  1
#6  2010  2
#7  2011  3
#8  2012  4
#9  2013  5
#10 2014  6
#11 2015  7
#12 2016  8
#13 2017  9
#14 2018 10
另外,建议您使用。

您就快到了:

foo1 %>% mutate(h = if_else(date > 2008, cumsum(date > 2008), 99L))
#   date  h
#1  2005 99
#2  2006 99
#3  2007 99
#4  2008 99
#5  2009  1
#6  2010  2
#7  2011  3
#8  2012  4
#9  2013  5
#10 2014  6
#11 2015  7
#12 2016  8
#13 2017  9
#14 2018 10

建议使用。

函数的
ifelse
包含三个参数:

  • 测试
    :一个
    逻辑
    向量。假设它的长度为
    N
  • :向量。它可以是任何长度。如果长度不是
    N
    ,则向量被循环/缩短为长度
    N
  • no
    :与
    yes
    相同
  • 在这个预处理阶段结束时,您有3个相同长度的向量
    ifelse
    然后根据
    test
    构建选择第二个向量或第三个向量的返回值

    就你而言,我们有:

    test <- foo1$date>2008 #length: 14
    yes <- seq(1,11,1) #length: 11
    no <- 99 #length: 1
    

    你可以看到回收是如何工作的。然后,为了构建返回值,
    ifelse
    按照上面的顺序,如果
    test
    TRUE
    则选择
    yes
    元素,否则选择
    no
    元素。这就解释了为什么会有这个返回值。当然,这不是关于dplyr的。

    函数的
    ifelse
    包含三个参数:

  • 测试
    :一个
    逻辑
    向量。假设它的长度为
    N
  • :向量。它可以是任何长度。如果长度不是
    N
    ,则向量被循环/缩短为长度
    N
  • no
    :与
    yes
    相同
  • 在这个预处理阶段结束时,您有3个相同长度的向量
    ifelse
    然后根据
    test
    构建选择第二个向量或第三个向量的返回值

    就你而言,我们有:

    test <- foo1$date>2008 #length: 14
    yes <- seq(1,11,1) #length: 11
    no <- 99 #length: 1
    

    你可以看到回收是如何工作的。然后,为了构建返回值,
    ifelse
    按照上面的顺序,如果
    test
    TRUE
    则选择
    yes
    元素,否则选择
    no
    元素。这就解释了为什么会有这个返回值。当然,这不是关于
    dplyr

    Base R option:
    foo1$h 2008]=1:10
    您的编辑是一个完全不同的问题,但与您不太了解
    ifelse
    (或
    if_else
    )的工作原理有关。
    if_else
    给出的错误应该能让你知道哪里出了问题(这正是为什么你应该使用
    dplyr::if_else
    而不是base R
    ifelse
    )。base R选项:
    foo1$h 2008]=1:10
    你的编辑是一个完全不同的问题,但这与您不太了解
    ifelse
    (或
    if_else
    )的工作原理有关。
    if_else
    给出的错误应该让您知道哪里出了问题(这正是您应该使用
    dplyr::if_else
    而不是base R
    ifelse
    的原因之一)。