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

Mar*_*ijn 1 if-statement r lag

我想在我的表中添加一列,该列将值与现有列“农场”中的先前值进行比较(以检查其是否相同);并且还控制当前行中的值是否为“ NULL”。目的是当该行的“农场”列中的值与“农场”列的上一行中的值不同时,在新的列“切换”中取回值“ new”。(例如,当服务器场中的值为“ NULL”时,我想返回“”)

请参阅以下所需的输出:

farm    switch
A   
A   
NULL    
B   new
B   
B   
A   new
A   
A   
B   new
B   
B   
NULL    
A   new
A   
Run Code Online (Sandbox Code Playgroud)

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

#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)
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 5

我们通过将当前行与下一行进行比较来创建逻辑索引(“ ind”)(我们可以通过删除“ farm”列的第一个和最后一个元素进行比较来做到这一点),并且还包括该元素为不"NULL"。基于逻辑索引,我们可以将TRUE更改为“ New”,将FALSE更改''ifelse

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       
Run Code Online (Sandbox Code Playgroud)

要理解的概念[-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
Run Code Online (Sandbox Code Playgroud)

当我们比较这两者时,我们正在比较当前行(v1[-length(v1)])与下一行(v1[-1])。由于长度比原始长度“ v1”小一,我们根据逻辑条件附加“ TRUE”或“ FALSE”

 c(FALSE, v1[-1]!= v1[-length(v1)])
Run Code Online (Sandbox Code Playgroud)

在您的情况下,有第二个条件断言该值不能为"NULL"。因此,当将两者与结合使用时&,只有TRUE它们两者中的值都为'TRUE',其余均为'FALSE'。

数据

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))
Run Code Online (Sandbox Code Playgroud)