R代码可根据特定条件创建新变量

时间:2019-07-14 14:12:01

标签: r

我的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))

我得到一个+,要求更多代码。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 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