9

假设我有一个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%吗?如果是这样,怎么做?

感谢您的任何帮助

4

2 回答 2

6

我想这就是你要找的。你如何制作你的有几个问题data.frame

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

然后要将 的值更新flag为 1 where idis in ,您可以使用和逻辑测试对temp这些值进行索引,并将它们分配为 1[%in%

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
于 2013-07-01T23:10:48.653 回答
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解决方案,因为我发现该构造很难概括复杂的情况。

于 2013-07-01T23:47:16.503 回答