使用ifelse或if else创建向量

时间:2015-10-23 16:45:38

标签: r if-statement vector

当我想要创建ifelse或新if...else变量时,我仍然会使用vectordata.frame绊倒。这个问题的标题似乎密切相关,但没有解决我的问题:Why can't R's ifelse statements return vectors?

以下代码显示了我创建变量my.data2$v1bmy.data2$v2b的尝试。我在ifelseif...else失败了,然后成功了for-loopapply

有没有办法用my.data2$v1bmy.data2$v2b创建ifelseif...else?我假设不是基于我的尝试和其他Stack Overflow个问题。那么,在R中创建这些变量的规范方法是什么?使用apply有效,但看起来相当复杂。使用for-loop有效但我得到的印象是for-loops

关于ifelse有很多问题,但我找不到解决这个问题的问题:鉴于ifelseif...else似乎不起作用,最佳解决方案是什么? ?对不起,如果这是重复的。

这是我的数据集:

my.data2 <- read.table(text = '
    refno  v1  v2 state1 state2 xday first last
      111  41  47      1      2   42     1    2
      111  41  47      1      2   42     2    1
      222  45  49      1      4   47     1    2
      222  45  49      1      4   47     2    1
      333  59  65      1      2   65     1    2
      333  59  65      1      2   65     2    1
      444  45  49      1      2   48     1    2
      444  45  49      1      2   48     2    1
      555  66  80      1      2   75     1    2
      555  66  80      1      2   75     2    1
      666 103 109      1      2  108     1    2
      666 103 109      1      2  108     2    1
      777  43  46      1      2   45     1    2
      777  43  46      1      2   45     2    1
', header = TRUE, stringsAsFactors = FALSE)

以下是所需的载体:

desired.data.v1b <- c(41,42, 45,47, 59,65, 45,48, 66,75, 103,108, 43,45)
desired.data.v2b <- c(42,47, 47,49, 65,65, 48,49, 75,80, 108,109, 45,46)

这是我开始尝试创建这些向量的地方:

v1b <- my.data2$v1
v2b <- my.data2$v2

# this ifelse does not work
my.data2$v1b < ifelse(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & my.data2$last  == 1, my.data2$xday, my.data2$v1)
my.data2$v2b < ifelse(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & my.data2$first == 1, my.data2$xday, my.data2$v2)

# this if...else does not work
if(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & my.data2$last  == 1) {v1b = my.data2$xday} else {v1b = my.data2$v1}
if(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & my.data2$first == 1) {v2b = my.data2$xday} else {v2b = my.data2$v2}

# this for-loop works
for(i in 1:nrow(my.data2)) {

     if(my.data2$state1[i] == 1 & my.data2$state2[i] %in% c(2,4) &   my.data2$last[i]  == 1)  {v1b[i] = my.data2$xday[i]}
     if(my.data2$state1[i] == 1 & my.data2$state2[i] %in% c(2,4) & !(my.data2$last[i]  == 1)) {v1b[i] = my.data2$v1[i]  }

     if(my.data2$state1[i] == 1 & my.data2$state2[i] %in% c(2,4) &   my.data2$first[i] == 1)  {v2b[i] = my.data2$xday[i]}
     if(my.data2$state1[i] == 1 & my.data2$state2[i] %in% c(2,4) & !(my.data2$first[i] == 1)) {v2b[i] = my.data2$v2[i]  }

}

all.equal(desired.data.v1b, v1b)
all.equal(desired.data.v2b, v2b)

my.data2$v1b <- v1b
my.data2$v2b <- v2b

# this apply works
my.v1 <- apply(my.data2, 1, function(x) {if (x['state1'] == 1 & x['state2'] %in% c(2,4) & x['last']  == 1) {x['v1b'] = x['xday']} else {x['v1b'] = x['v1']}})
my.v2 <- apply(my.data2, 1, function(x) {if (x['state1'] == 1 & x['state2'] %in% c(2,4) & x['first'] == 1) {x['v2b'] = x['xday']} else {x['v2b'] = x['v2']}})
names(my.v1) <- NULL
names(my.v2) <- NULL

all.equal(desired.data.v1b, my.v1)
all.equal(desired.data.v2b, my.v2)

修改

也许这是规范的解决方案?

my.data2$v1b <- rep(-99, nrow(my.data2))
my.data2$v2b <- rep(-99, nrow(my.data2))

my.data2$v1b[(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) &   my.data2$last  == 1) ] <- my.data2$xday[(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) &   my.data2$last  == 1) ]
my.data2$v1b[(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & !(my.data2$last  == 1))] <- my.data2$v1[  (my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & !(my.data2$last  == 1))]

my.data2$v2b[(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) &   my.data2$first == 1) ] <- my.data2$xday[(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) &   my.data2$first == 1) ]
my.data2$v2b[(my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & !(my.data2$first == 1))] <- my.data2$v2[  (my.data2$state1 == 1 & my.data2$state2 %in% c(2,4) & !(my.data2$first == 1))]

all.equal(desired.data.v1b, my.data2$v1b)
all.equal(desired.data.v2b, my.data2$v2b)

0 个答案:

没有答案