我的A列带有值。如果要满足以下条件,我想将A列中的值除以2或3:
条件1:如果B列和C列= 250,则将A列除以2;否则,将A列除以2。 条件2:如果C列和D列= 250,则将A列除以2;否则,将A列除以2。 条件3:如果B列,C列和D列= 250,则将A列除以3
条件4:如果B列和C列= 500,则将A列除以2;否则,将A列除以2。 条件2:如果C列和D列= 500,则将A列除以2;否则,将A列除以2。 条件3:如果B列,C列和D列= 500,则将A列除以3
以此类推。...
换句话说,如果两列(来自B,C和D的列)具有相同的2个值,则除以2;如果三列具有相同的3个值,则除以3。
例如,数据为:
A B C D
0.666667 250 500 250
0.666667 500 500 1000
0.666667 250 1000 1000
0.666667 500 500 1000
0.666667 250 500 500
0.666667 250 500 500
关于计数,这是我在条件的第一部分之后得到的,例如在第1行中有2-250和1-500,因此有2,1,2对应于B1,C1,D1列: / p>
A B C D B1 C1 D1
0.666667 250 500 250 2 1 2
0.666667 500 500 1000 2 2 1
0.666667 250 1000 1000 1 2 2
0.666667 500 500 1000 2 2 1
0.666667 250 500 500 1 2 2
0.666667 250 500 500 1 2 2
我现在需要将A列除以B1,将A除以C1,将A除以D1,然后再给我三个新列AR,BR,CR
A B C D BR CR DR
0.666667 250 500 250 0.333 0.667 0.333
0.666667 500 500 1000 0.333 0.333 0.667
0.666667 250 1000 1000 0.667 0.333 0.333
0.666667 500 500 1000 0.333 0.333 0.667
0.666667 250 500 500 0.667 0.333 0.333
0.666667 250 500 500 0.667 0.333 0.333
0.666667 500 500 500 0.222 0.222 0.222
我仍在尝试编写代码。
data %>% mutate(A1 == ifelse(B == 250 & C == 250, A/2, ifelse(B == 250 & D == 250, A/2, ifelse(B == 250 & C == 250 & D == 250, A/3))
data %>% mutate(A1 == ifelse(B == 500 & C == 500 , A/2, ifelse(B == 500 & D == 500 , A/2, ifelse(B == 500 & C == 500 & D == 500, A/3))
data %>% mutate(A1 == ifelse(B == 1000 & C == 1000 , A/2, ifelse(B == 1000 & D == 1000 , A/2, ifelse(B == 1000 & C == 1000 & D == 1000, A/3))
我得到一个+,要求更多代码。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
尝试以下操作:创建一列s.c
,这是您看到该行(A
)和该数字(value
)的每种组合的特定次数。然后,您可以将发生次数除以2/3,然后将数据重整为原始的宽格式。
library(reshape) #melt and cast are from here
data<-read.table(text="
A B C D
0.666667 250 500 250
0.666667 500 500 1000
0.666667 250 1000 1000
0.666667 500 500 1000
0.666667 250 500 500
0.666667 250 500 500
",header=T)
data$A<-letters[1:nrow(data)]
data<-melt(data,id.vars = "A")
combo_c<-do.call(paste,data[c("value","A")])
data$s.c<-as.integer(ave(as.character(data$variable), combo_c, FUN=function(combo_c) length(unique(combo_c))))
data$R<-(2/3)/data$s.c
data<-melt(data,measure.vars = c("value","s.c","R"))
names(data)[names(data)=="variable"]<-c("v1","v2")
cast(data,A~v2+v1)
以下是输出:
> cast(data,A~v2+v1)
A value_B value_C value_D s.c_B s.c_C s.c_D R_B R_C R_D
1 a 250 500 250 2 1 2 0.3333333 0.6666667 0.3333333
2 b 500 500 1000 2 2 1 0.3333333 0.3333333 0.6666667
3 c 250 1000 1000 1 2 2 0.6666667 0.3333333 0.3333333
4 d 500 500 1000 2 2 1 0.3333333 0.3333333 0.6666667
5 e 250 500 500 1 2 2 0.6666667 0.3333333 0.3333333
6 f 250 500 500 1 2 2 0.6666667 0.3333333 0.3333333