为什么我的ifelse语句不起作用?“else”语句只返回NA r

tcbh2hod  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(156)

ifelse语句的“else”部分不起作用。不管我在“else”参数中放了什么,它都返回NA。
以下是一些样本数据:

test<-structure(list(time = c(1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 
2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 
2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 2, 4, 1, 
2, 4, 1, 2, 4, 1, 2, 4), nowsmoke = c(NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, TRUE, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, TRUE, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), eversmoke = c(NA, 
NA, TRUE, NA, NA, TRUE, NA, NA, NA, NA, NA, TRUE, NA, NA, NA, 
NA, NA, NA, NA, NA, TRUE, NA, NA, NA, NA, NA, TRUE, NA, NA, TRUE, 
NA, NA, TRUE, NA, NA, NA, NA, NA, TRUE, NA, NA, NA, NA, NA, TRUE, 
NA, NA, NA, NA, NA, TRUE, NA, NA, TRUE, NA, NA, NA, NA, NA, NA, 
NA, NA, TRUE)), row.names = c(NA, 63L), class = "data.frame")

下面是一个ifelse语句的例子,我一直在努力工作:

test$nowsmoke<-ifelse(test$nowsmoke==TRUE,TRUE,FALSE)

这里是另一个:

long_data_cancer_ceramide$smoker_4<-
ifelse(long_data_cancer_ceramide$nowsmoke==TRUE, 
     3,
     ifelse(is.na(long_data_cancer_ceramide$nowsmoke) &
       long_data_cancer_ceramide$eversmoke==TRUE,
            2,
            ifelse(is.na(long_data_cancer_ceramide$nowsmoke)&
                     is.na(long_data_cancer_ceramide$eversmoke)&
                     long_data_cancer_ceramide$time==4,
                   1,
                   NA
                   )
            )
     )

看起来我能够让语句的前两部分工作(if,then)。但是else总是返回NA。所以第二个ifelse语句在“3”之后停止工作,

bttbmeg0

bttbmeg01#

您需要重新排序ifelse语句中的条件,其中您需要首先测试is.na。如果您首先测试条件if TRUE,则NA条目将不适合后续的ifelse,因为NA既不是TRUE也不是FALSE,因此不会在ifelse循环中进行计算。
另一个建议:如果value已经是逻辑的,你不需要测试if value == TRUE,只要if value就可以了。if !value测试if value == FALSE

long_data_cancer_ceramide$smoker_4<-ifelse(is.na(long_data_cancer_ceramide$nowsmoke)&
                       is.na(long_data_cancer_ceramide$eversmoke)&
                       long_data_cancer_ceramide$time==4,
                     1,
       ifelse(is.na(long_data_cancer_ceramide$nowsmoke) &
                long_data_cancer_ceramide$eversmoke,
              2,
              ifelse(long_data_cancer_ceramide$nowsmoke, 
              3, NA)))

   time nowsmoke eversmoke smoker_4
1     1       NA        NA       NA
2     2       NA        NA       NA
3     4       NA      TRUE        2
4     1       NA        NA       NA
5     2       NA        NA       NA
6     4       NA      TRUE        2
7     1       NA        NA       NA
8     2       NA        NA       NA
9     4       NA        NA        1
10    1       NA        NA       NA
11    2       NA        NA       NA
12    4       NA      TRUE        2
13    1       NA        NA       NA
14    2       NA        NA       NA
15    4     TRUE        NA        3
16    1       NA        NA       NA
17    2       NA        NA       NA
18    4       NA        NA        1
19    1       NA        NA       NA
20    2       NA        NA       NA
21    4       NA      TRUE        2
22    1       NA        NA       NA
23    2       NA        NA       NA
24    4       NA        NA        1
25    1       NA        NA       NA
26    2       NA        NA       NA
27    4     TRUE      TRUE        3
28    1       NA        NA       NA
29    2       NA        NA       NA
30    4       NA      TRUE        2
31    1       NA        NA       NA
32    2       NA        NA       NA
33    4       NA      TRUE        2
34    1       NA        NA       NA
35    2       NA        NA       NA
36    4       NA        NA        1
37    1       NA        NA       NA
38    2       NA        NA       NA
39    4       NA      TRUE        2
40    1       NA        NA       NA
41    2       NA        NA       NA
42    4       NA        NA        1
43    1       NA        NA       NA
44    2       NA        NA       NA
45    4       NA      TRUE        2
46    1       NA        NA       NA
47    2       NA        NA       NA
48    4       NA        NA        1
49    1       NA        NA       NA
50    2       NA        NA       NA
51    4       NA      TRUE        2
52    1       NA        NA       NA
53    2       NA        NA       NA
54    4       NA      TRUE        2
55    1       NA        NA       NA
56    2       NA        NA       NA
57    4       NA        NA        1
58    1       NA        NA       NA
59    2       NA        NA       NA
60    4       NA        NA        1
61    1       NA        NA       NA
62    2       NA        NA       NA
63    4       NA      TRUE        2
gijlo24d

gijlo24d2#

交替编码

tmp=pmax(test$nowsmoke*3,test$eversmoke*2,na.rm=T)
tmp[rowSums(is.na(test[,-1]))==2 & test$time==4]=1

 [1] NA NA  2 NA NA  2 NA NA  1 NA NA  2 NA NA  3 NA NA  1 NA NA  2 NA NA  1 NA NA  3 NA
[29] NA  2 NA NA  2 NA NA  1 NA NA  2 NA NA  1 NA NA  2 NA NA  1 NA NA  2 NA NA  2 NA NA
[57]  1 NA NA  1 NA NA  2

相关问题