【问题标题】:R - How can I check if a value in a row is different from the value in the previous row?R - 如何检查一行中的值是否与前一行中的值不同?
【发布时间】:2015-11-03 17:31:52
【问题描述】:

我想在我的表中添加一个列,将一个值与现有列“农场”中的前一个值进行比较(以检查它是否相同);并且还控制当前行中的值是否为“NULL”。目标是当该行的“农场”列中的值与“农场”列的前一行中的值不同时,返回新列“切换”值“新”。 (除非farm中的值为“NULL”,然后我想取回“”)

在下面查看所需的输出:

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)

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

【问题讨论】:

  • 在填充数据之前,无需添加新的NA 值列:第一条语句完全是多余的。

标签: r if-statement lag


【解决方案1】:

我们通过将当前行与下一行进行比较来创建一个逻辑索引 ('ind')(我们可以通过删除 'farm' 列的第一个和最后一个元素来进行比较),并且还包括以下条件该元素不是"NULL"。根据逻辑索引,我们可以用ifelse将TRUE改为'New',FALSE改为''

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]) 进行比较。由于长度比“v1”的原始长度小一,我们根据我们的逻辑条件附加一个“真”或“假”

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

在您的情况下,有第二个条件断言该值不能是"NULL"。因此,当将这两者与&amp; 结合使用时,只有两者中的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))

【讨论】:

  • 您好 akrun,感谢您的回答。这可行,但我不明白您正在使用的代码:farm[-1L] --> 我假设这是指上一行的“farm”值? farm[-length(farm)]) --> 这个操作是什么意思?您能否还澄清一下我可以使用哪些代码来验证当前行是否与 NEXT 行不同?我尝试了 +1L,但这不起作用..谢谢让我知道!
  • @Martijn 添加了一些解释。希望对您有所帮助。
  • 谢谢!这说明了很多! +1 请参阅下面的方法来控制与下一行是否存在差异:MyData$farm_new &lt;- c(MyData$farm[-1L],MyData$farm[nrow(MyData)])MyData$check &lt;- ifelse((MyData$farm != MyData$farm_new) &amp; (MyData$farm != "NULL"),"loss","")MyData$farm_new &lt;- NULL
  • @akrun 有没有办法像在 data.table 中那样提供这个解决方案,by 参数?
  • @akrun 我为它提出了一个新问题stackoverflow.com/questions/59073241/…
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多