2017-04-21 23 views
0
date  A B C 
11/24/2016 0 -1 -1 
11/23/2016 -1 -1 -1 
11/22/2016 0 -1 -1 
11/21/2016 0 -1 -1 
11/18/2016 -1 -1 -1 
11/17/2016 -1 -1 -1 
11/16/2016 -1 -1 -1 
11/15/2016 -1 -1 -1 
11/14/2016 -1 -1 -1 
11/11/2016 -1 -1 -1 
11/10/2016 0 -1 0 
11/9/2016 0 -1 0 

C的excel命令(假设数据从第2行开始)为=IF(A2=-1, -1, IF(AND(B2=-1,C3=-1),-1,0))。所以基本上,如果列A是-1,那么列C也将是-1。否则,我们将检查是否B2=-1以及C下面的行是否为-1。在Excel中,我可以通过简单地复制/粘贴公式来完成此操作,并且C列会自动更新。我不认为这是相当的R.R - 从Excel复制IF()逻辑命令到R

在R作为简单的,我有一个山坳AB价值观,我想用这些列创建C像我如何通过Excel中一样。然而,我一直在想如何做到这一点已经有一段时间了。这是因为'C'依赖于'A',如果失败则取决于'B'和它自身的滞后值。帮助将非常感谢!

编辑:我有一些想法,可能工作。

for (i in 1:length(dat[,1])){ 

     dat[i,3] <- ifelse(dat[i,1]==-1, -1, 0) 

     } 

运行第一循环之后,我得到:

A B V3 
1 0 -1 0 
2 -1 -1 -1 
3 0 -1 0 
4 0 -1 0 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 -1 
11 0 -1 0 
12 0 -1 0 

现在的第二个条件:

for (i in 2:length(dat[,1])){ 

     dat[i-1,3] <- ifelse(dat[i-1,2]==-1&dat[i,3]==-1, -1, dat[i,3]) 

     } 

对于第二个条件,我希望的是,for()将检查在它之前的行并且迭代地填充-1 s,只要在C中的当前行之前存在-1行,并且-1一个当前行中B.然而,在这结束返回:

A B V3 
1 0 -1 -1 
2 -1 -1 0 
3 0 -1 0 
4 0 -1 -1 
5 -1 -1 -1 
6 -1 -1 -1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 -1 -1 
10 -1 -1 0 
11 0 -1 0 
12 0 -1 0 

我需要row2留为-1,这样row3可以得到填补为-1。

+2

所以你已经有'C'列的值了吗? –

+0

@Ronak Shah对不起!应该澄清。我在R中有'A'和'B'的值,我想用这些来创建'C',就像我在Excel中做的一样。将编辑我的文章! – Nikitau

+0

'dplyr :: case_when'可以很好地处理:'library(dplyr); df%>%mutate(C = case_when(A == -1〜-1,B == -1&lead(C)== -1〜-1,TRUE〜0))'否则可以使用嵌套'ifelse '电话,但那会变得混乱。 – alistaire

回答

0

在R中可以使用 'ifelse' 功能:

x<-data.set.name 
y<-ifelse(x$A==-1,-1,ifelse(x$B==-1 & X$C==-1,-1,0)) 

这应该这样做。

+1

但是,您需要从下一行获取'C'的值。 – alistaire

+0

嗨,我认为这可能是“铅”或“滞后”C?另外,我遇​​到的问题是'C'实际上并没有在R中生成。在Excel中,我能够复制/粘贴公式并使列'C'自动更新自己。我不太确定这是如何在R. – Nikitau

+0

@alistaire Yup中工作的。并且使事情复杂化,我不得不在R.中产生'C'。 – Nikitau

1

问题是,因为您正在从您计算的以下值中绘制,因此需要从底部开始计算,因为这些值可能会一直到顶部。 Reduceright = TRUEaccumulate = TRUE可以创建逻辑:

df$C <- sapply(
    Reduce(
     function(x, y){ 
      if (x[[1]] == -1) { -1 } else if (x[[2]] == -1 & y[[1]] == -1) { -1 } else { 0 } 
     }, 
     Map(c, df$A, df$B), right = TRUE, accumulate = TRUE), 
    `[`, 1) 

df 
#>   date A B C 
#> 1 11/24/2016 0 -1 -1 
#> 2 11/23/2016 -1 -1 -1 
#> 3 11/22/2016 0 -1 -1 
#> 4 11/21/2016 0 -1 -1 
#> 5 11/18/2016 -1 -1 -1 
#> 6 11/17/2016 -1 -1 -1 
#> 7 11/16/2016 -1 -1 -1 
#> 8 11/15/2016 -1 -1 -1 
#> 9 11/14/2016 -1 -1 -1 
#> 10 11/11/2016 -1 -1 -1 
#> 11 11/10/2016 0 -1 0 
#> 12 11/9/2016 0 -1 0 

由于它运行的每一行的迭代器,它不会是非常快的,但将罚款1K行。

所有这一切,这里的逻辑是可疑的,你应该在上下文中仔细考虑你的计算是否有意义。

+0

谢谢!我不知道'减少'可以做到这一点。对于我的原始数据,这是一个data.frames列表,我有点困难。如果我的原始示例数据是我的许多data.frames(df [[1]]中的一个以返回所有列,而df [[1]] [,3]以检索列C),那么我将如何实现上述代码? – Nikitau

+0

您可以将整个事件映射到'lapply'内部的列表中,或者data.frame无论如何都是相似的,将它们绑定到一个大数据框中,并带有一个ID列,它们来自哪个元素('dplyr :: bind_rows'与它的'.id'参数设置使这变得简单),并按组应用它。你也可以看看'purrr',它有很多用于处理列表的工具。 – alistaire