在数据框中获取新变量的问题

时间:2016-01-01 17:09:16

标签: r dataframe

我的数据框如下:

  V1 V2   V3
1  1  4  0.5
2  2  1  1.0
3  4  2  2.0
4  4  1  5.0
5  1  4 17.0
6  2  3 20.0
7  1  3 50.0



structure(list(V1 = c(1L, 2L, 4L, 4L, 1L, 2L, 1L), V2 = c(4L, 
1L, 2L, 1L, 4L, 3L, 3L), V3 = c(0.5, 1, 2, 5, 17, 20, 50)), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -7L))

我试图根据同一数据帧的另一个变量中的某些条件向此数据帧添加一列:

k1a<-test$V1[test$d1[test$V3<1 |test$V3==1]<- 1]
k1b<-test$V2[test$d2[test$V3<1 |test$V3==1]<- 1]
k2a<-test$V1[test$d1[test$V3<5 |test$V3==5  & test$V3>1 |test$V3==1] <- 2]
k2b<-test$V2[test$d2[test$V3<5 |test$V3==5  & test$V3>1 |test$V3==1] <- 2]
k3a<-test$V1[test$d1[test$V3> 5 ]<- 3]
k3b<-test$V2[test$d2[test$V3> 5 ]<- 3]

如果test$d2>5,我会为V1V2分配12值,否则我将分配给d1=3d2=4

我试过了:

ifelse(k3a!=2 ! k3a!=1,k3a==1!k3a==2,k3a==3)
ifelse(k3b!=2 ! k3b!=1,k3b==1!k3b==2,k3b==3)

问题是未正确分配受k3ak3b影响的值。

我想得到的输出是:

  V1 V2   V3 d1 d2
1  1  4  0.5  1  1
2  2  1  1.0  1  1
3  4  2  2.0  2  2
4  4  1  5.0  2  2
5  1  4 17.0  1  1
6  2  3 20.0  1  3
7  1  3 50.0  1  3

2 个答案:

答案 0 :(得分:0)

不确定你想要在这里实现什么,但如果你只需要从

获得
  V1 V2   V3
1  1  4  0.5
2  2  1  1.0
3  4  2  2.0
4  4  1  5.0
5  1  4 17.0
6  2  3 20.0
7  1  3 50.0

  V1 V2   V3 d1 d2
1  1  4  0.5  1  1
2  2  1  1.0  1  1
3  4  2  2.0  2  2
4  4  1  5.0  2  2
5  1  4 17.0  1  1
6  2  3 20.0  1  3
7  1  3 50.0  1  3

也许这3个步骤会有帮助吗?

test$d1 <- ifelse(test$V3<=1 | test$V3 > 5, 1, 2)
test$d2 <- test$d1
test$d2 <- ifelse(test$V3 >= 20, 3,test$d2

答案 1 :(得分:0)

很抱歉使用答案空间来获得真正的扩展评论,但是评论太多了。如果简化这些条件表达式,您可以看到某些条件不是不相交的:

k1a<-test$V1[test$d1[test$V3<=1 ]<- 1]
k1b<-test$V2[test$d2[test$V3<=1 ]<- 1]
k2a<-test$V1[test$d1[test$V3<=5   & test$V3>=1 ] <- 2]
k2b<-test$V2[test$d2[test$V3<=5   & test$V3>=1] <- 2]
k3a<-test$V1[test$d1[test$V3> 5 ]<- 3]
k3b<-test$V2[test$d2[test$V3> 5 ]<- 3]

请注意,对于测试$ V3 == 1,测试$ V3&lt; = 1和(test $ V3&lt; = 5&amp; test $ V3&gt; = 1)都将为TRUE。

在尝试在提取/赋值运算符<-中使用[时,还有一个更严重的问题。这完全令人困惑,即使它没有抛出错误。它基本上导致所有逻辑测试被忽略。看看你第一次分配的结果:

 test$V1[test$d1[test$V3<1 |test$V3==1]<- 1]   # returns 1
 # because 

由于您只将值1:3分配给test$d2>5test$d1,因此test$d2无法实现。 我认为您应该使用findInterval创建一些不相交的条件,然后使用它们。你的意图一点也不清楚,因为代码是如此模糊,你没有完全用自然语言描述过程。