2013-07-01 32 views
7

假设标志我有一个data.frame如下:设置,如果列值与另一个向量匹配

a <- data.frame(id=c(1,3,4,5,7,8,9,6,54,3,5,6,87,6)) 

而且我有一个载体temp如下:

temp<-c(1,3,5,9) 

现在,我想创建一个新的列flag在我的data.frame上,它应该是1其中idtemp0其他地方。这是我试过的:

a$flag <- ifelse(a$id==temp, 1, 0) 

和期望的输出应该是(1,1,0,1,0,0,1,0,0,1,1,0,0,0)

但是从我上面的代码中,flag没有正确更新。我在这里错过了什么? 可以/应该使用%in%?如果是这样,怎么样?

谢谢你的任何帮助

+2

+1,欢迎来到SO。但是,这似乎是一个非常基本的问题。我建议你在发帖前先搜索一下。 – Arun

+0

由于载体长度不同,'ifelse'不能正常工作。 –

回答

4

我认为这是你在找什么。还有你是如何让您的data.frame几个问题:

a <- data.frame(id = c(1,3,4,5,7,8,9,6,54,3,5,6,87,6), 
       flag = 0) 

然后到idtempflag值更新为1,你可以索引使用[这些价值观和逻辑测试%in%,和它们分配1

a$flag[a$id %in% temp] <- 1 

a 
# id flag 
# 1 1 1 
# 2 3 1 
# 3 4 0 
# 4 5 1 
# 5 7 0 
# 6 8 0 
# 7 9 1 
# 8 6 0 
# 9 54 0 
# 10 3 1 
# 11 5 1 
# 12 6 0 
# 13 87 0 
# 14 6 0 
+0

Perfecto!我不知道为什么ifelse没有工作。非常感谢 !! –

+1

@carlwhyte,尝试运行'$ id == temp'并尝试了解发生了什么(包括警告消息)。提示:因为'temp'与'a $ id'的长度不同,所以它会被*回收*。 – Arun

+0

我明白了,谢谢Arun! –

1
a$flag <- 0 + (a$id %in% temp) 

的唯一原因,ifelse失败,是使用“==”当逻辑测试应该是%in%

a<- data.frame(id=c(1,3,4,5,7,8,9,6,54,3,5,6,87,6)) 
temp<-c(1,3,5,9) 

a$flag <- ifelse(a$id %in% temp, 1, 0) 

> a 
    id flag 
1 1 1 
2 3 1 
3 4 0 
4 5 1 
5 7 0 
6 8 0 
7 9 1 
8 6 0 
9 54 0 
10 3 1 
11 5 1 
12 6 0 
13 87 0 
14 6 0 

我更喜欢展示非ifelse解决方案,因为我发现,结构不佳推广到模式的复杂情况。

+0

为什么隐式转换?人们建议'as.numeric'。 – flodel

+0

有效的批评。 “+”操作的代码将执行强制操作。它的键击较少,但可能不会更快,因为会创建一个额外的矢量并进行计算。我认为了解R隐式类型转换可能会有帮助。 –

相关问题