R 使用带ifelse条件的mutate时的排序问题
我试图使用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
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
相同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
相同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 Rifelse
)。base R选项:foo1$h 2008]=1:10
你的编辑是一个完全不同的问题,但这与您不太了解ifelse
(或if_else
)的工作原理有关。if_else
给出的错误应该让您知道哪里出了问题(这正是您应该使用dplyr::if_else
而不是base Rifelse
的原因之一)。