尝试使用ifelse在R中创建新变量的语法不正确

时间:2013-12-26 23:07:54

标签: r

大家好我想在R中的数据框中创建一个新变量,但我的代码ifelse()不起作用。我的数据框F具有下一个结构(我在最后一部分中包含dput()版本):

    ID rama2
1   1     7
2   2    16
3   3     1
4   4     7
5   5    16
6   6    16
7   7     7
8   8     9
9   9     1
10 10     7
11 11    16
12 12     7
13 13    13
14 14    20
15 15     7
16 16     9
17 17     3
18 18     3
19 19     9
20 20    20
21 21    NA
22 22     4
23 23     0
24 24     0
25 25     0
26 26     0
27 27     0
28 28     0
29 29     0
30 30     0
31 31     0
32 32     0

考虑到这种情况,我正在尝试计算新的变量名rama_act1: 1.如果rama2等于1 rama_act1等于1。 2.如果rama2等于0 rama_act1等于NA。 3.如果rama2等于NA,则rama_act1等于0。 4. rama2中不同的1(除0)的值也等于0.

我在考虑这些条件的情况下使用ifelse编写代码但出了点问题:

z$rama_act1=ifelse(z$rama2==1,1,
                   ifelse(z$rama2==0,NA,0))

我不知道发生了什么,因为这不适用于rama2 NA的{​​{1}}。 我使用最后一个代码得到了这个结果:

    ID rama2 rama_act1
1   1     7         0
2   2    16         0
3   3     1         1
4   4     7         0
5   5    16         0
6   6    16         0
7   7     7         0
8   8     9         0
9   9     1         1
10 10     7         0
11 11    16         0
12 12     7         0
13 13    13         0
14 14    20         0
15 15     7         0
16 16     9         0
17 17     3         0
18 18     3         0
19 19     9         0
20 20    20         0
21 21    NA        NA
22 22     4         0
23 23     0        NA
24 24     0        NA
25 25     0        NA
26 26     0        NA
27 27     0        NA
28 28     0        NA
29 29     0        NA
30 30     0        NA
31 31     0        NA
32 32     0        NA

第21行出现错误,我不知道为什么我的代码不考虑它。我想得到这样的东西:

    ID rama2 rama_act1
1   1     7         0
2   2    16         0
3   3     1         1
4   4     7         0
5   5    16         0
6   6    16         0
7   7     7         0
8   8     9         0
9   9     1         1
10 10     7         0
11 11    16         0
12 12     7         0
13 13    13         0
14 14    20         0
15 15     7         0
16 16     9         0
17 17     3         0
18 18     3         0
19 19     9         0
20 20    20         0
21 21    NA         0
22 22     4         0
23 23     0        NA
24 24     0        NA
25 25     0        NA
26 26     0        NA
27 27     0        NA
28 28     0        NA
29 29     0        NA
30 30     0        NA
31 31     0        NA
32 32     0        NA

我认为我的代码正在考虑NAs,但它失败了。我的数据框的dput()版本是下一个:

structure(list(ID = 1:32, rama2 = c(7, 16, 1, 7, 16, 16, 7, 9, 
1, 7, 16, 7, 13, 20, 7, 9, 3, 3, 9, 20, NA, 4, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0)), .Names = c("ID", "rama2"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 101L, 500L, 34309L, 39982L, 40735L, 
41019L, 44463L, 44464L, 44465L, 44480L, 44481L, 44482L), class = "data.frame")

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

改写:

  1. 如果rama2等于1,则rama_act1等于1.
  2. 如果rama2等于0,则rama_act1等于NA。
  3. 如果rama2等于NA,则rama_act1等于0.
  4. rama2中1的不同值(0除外)也等于0.
  5. 也许(这)

      transform(dat,rama_act1=ifelse(is.na(rama2), 0,
                                     ifelse(rama2==1,1,
                                            ifelse(rama2==0,NA,0))))
    

答案 1 :(得分:2)

问题是NA无法比较:

ifelse(1==NA, 0, 1)
## [1] NA

要修复,请专门检查NA

z$rama_act1=ifelse(!is.na(z$rama2) & z$rama2==1,1,
               ifelse(z$rama2==0,NA,0))