我想在我的表中添加一个列,用于将值与现有列“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)
但是当我使用这段代码时,我添加的列只有空值? 有人可以澄清我做错了什么,并帮助我使用可能有效的代码吗?
答案 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 ~]$