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)
但是,当我使用此代码时,添加的列只有空值吗?有人可以澄清我做错了什么,并通过可能有效的代码帮助我吗?
我们通过将当前行与下一行进行比较来创建逻辑索引(“ 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)