R - 如何检查行中的值是否与上一行中的值不同?

时间:2015-11-03 17:31:53

标签: r if-statement lag

我想在我的表中添加一个列,用于将值与现有列“farm”中的先前值进行比较(以检查它是否相同);并控制当前行中的值是否为“NULL”。目标是当该行的“farm”列中的值与“farm”列的上一行中的值不同时,返回新列“switch”中的值“new”。 (当farm中的值为“NULL”时,exept然后我想回到“”)

见下文所需的输出:

farm    switch
A   
A   
NULL    
B   new
B   
B   
A   new
A   
A   
B   new
B   
B   
NULL    
A   new
A   

我尝试使用以下代码解决此问题:

#To add a new column switch
MyData["switch"] <- NA

#To check if the value is different from the previous row; and if the value is different from NULL
MyData$switch <- ifelse((MyData$farm == lag(MyData$farm))||MyData$farm=="NULL","",MyData$farm)

但是当我使用这段代码时,我添加的列只有空值? 有人可以澄清我做错了什么,并帮助我使用可能有效的代码吗?

1 个答案:

答案 0 :(得分:4)

我们通过比较当前行和下一行来创建逻辑索引(&#39; ind&#39;)(我们可以通过删除&#39; farm&#39;列的第一个和最后一个元素来实现用于比较),还包括元素不是"NULL"的条件。根据逻辑索引,我们可以将TRUE更改为&#39; New&#39; ''ifelse {F}相对应。{/ p>

ind <- with(MyData, c(FALSE, farm[-1L]!= farm[-length(farm)]) & farm!='NULL')
MyData$switch <- ifelse(ind, 'New', '')

MyData
#   farm switch
#1     A       
#2     A       
#3  NULL       
#4     B    New
#5     B       
#6     B       
#7     A    New
#8     A       
#9     A       
#10    B    New
#11    B       
#12    B       
#13 NULL       
#14    A    New
#15    A       

要理解[-1L]-length的概念,假设我们有一个向量

v1 <- c(2, 2, 3, 1, 5)
v1[-1] #removes the first observation
#[1] 2 3 1 5

v1[-length(v1)]# removes the last one
#[1] 2 2 3 1

当我们比较这两个时,我们将当前行(v1[-length(v1)])与下一行(v1[-1])进行比较。由于长度比&#39; v1&#39;的原始长度小1,我们会附加一个“真实”&#39; TRUE&#39;或者&#39; FALSE&#39;取决于我们的逻辑条件

 c(FALSE, v1[-1]!= v1[-length(v1)])

在您的情况下,有第二个条件断言值不能是"NULL"。因此,当将这两者与&结合使用时,只有TRUE中的MyData <- structure(list(farm = c("A", "A", "NULL", "B", "B", "B", "A", "A", "A", "B", "B", "B", "NULL", "A", "A")), .Names = "farm", class = "data.frame", row.names = c(NA, -15L)) 值才会得到“真实”。和休息是“假”#39;

数据

[cloudera@localhost ~]$ hadoop jar /usr/lib;

Exception in thread "main" java.io.IOException: Error opening job   jar:    /usr/lib
at org.apache.hadoop.util.RunJar.main(RunJar.java:135)
Caused by: java.util.zip.ZipException: error in opening zip file

at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.jar.JarFile.<init>(JarFile.java:135)
at java.util.jar.JarFile.<init>(JarFile.java:72)
at org.apache.hadoop.util.RunJar.main(RunJar.java:133)

[cloudera@localhost ~]$