我的数据框如下:
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
,我会为V1
或V2
分配1
或2
值,否则我将分配给d1=3
和d2=4
我试过了:
ifelse(k3a!=2 ! k3a!=1,k3a==1!k3a==2,k3a==3)
ifelse(k3b!=2 ! k3b!=1,k3b==1!k3b==2,k3b==3)
问题是未正确分配受k3a
和k3b
影响的值。
我想得到的输出是:
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
答案 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>5
和test$d1
,因此test$d2
无法实现。
我认为您应该使用findInterval
创建一些不相交的条件,然后使用它们。你的意图一点也不清楚,因为代码是如此模糊,你没有完全用自然语言描述过程。