R 不同嵌套ifelse条件顺序的不同结果

R 不同嵌套ifelse条件顺序的不同结果,r,if-statement,R,If Statement,我正在尝试在数据帧中创建一个新列,该列将根据同一数据帧中多个其他列的条件包含信息。我的研究涉及冠状动脉(心脏动脉)闭塞程度的量化 示例数据帧x为: structure(list(Study_number = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12,

我正在尝试在数据帧中创建一个新列,该列将根据同一数据帧中多个其他列的条件包含信息。我的研究涉及冠状动脉(心脏动脉)闭塞程度的量化

示例数据帧
x
为:

structure(list(Study_number = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 
3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 
9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 
13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 
17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 
21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 
25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 
29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 
34, 34, 34, 34, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 
38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 
42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 
46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 
50, 51, 51, 51, 51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 
55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 
59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 63, 63, 63, 
63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66), Vessel = c(1, 2, 
3, 4, 1, 2, 3, 4, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 
1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 
4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 
1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 
2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 2, 3, 4, 1, 2, 3, 
4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 1, 
2, 3, 4, 2, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 
2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 
3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 
4, 1, 2, 3, 4, 1, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 3, 4, 1, 2, 
3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 
4, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 2, 3), Segment = c(3, 
9, 7, 8, 2, 9, 7, 8, 9, 7, 8, 3, 9, 6, 11, 3, 9, 6, 8, 2, 9, 
9, 15, 2, 9, 7, 8, 2, 9, 6, 8, 2, 9, 2, 9, 7, 8, 3, 9, 9, 11, 
1, 9, 7, 8, 2, 9, 6, 8, 2, 9, 7, 11, 1, 9, 6, 12, 2, 9, 7, 11, 
2, 9, 6, 15, 2, 9, 6, 8, 2, 9, 7, 8, 3, 9, 7, 11, 2, 9, 6, 11, 
2, 9, 7, 8, 1, 9, 6, 11, 2, 9, 8, 11, 2, 9, 7, 8, 2, 9, 7, 11, 
9, 7, 11, 2, 9, 6, 11, 3, 9, 7, 11, 2, 9, 6, 11, 2, 9, 7, 8, 
1, 9, 6, 11, 4, 9, 7, 3, 9, 7, 8, 9, 2, 9, 7, 8, 2, 9, 7, 11, 
1, 9, 7, 14, 2, 9, 7, 11, 2, 9, 6, 12, 2, 9, 6, 11, 2, 9, 7, 
8, 2, 9, 9, 8, 2, 9, 7, 12, 2, 9, 7, 11, 1, 9, 7, 8, 2, 9, 7, 
15, 2, 9, 6, 11, 2, 9, 6, 8, 3, 9, 10, 14, 2, 9, 6, 11, 1, 6, 
11, 1, 9, 6, 8, 1, 9, 7, 11, 2, 8, 12, 2, 9, 7, 8, 1, 9, 7, 11, 
0, 9, 6, 12, 1, 9, 7, 8, 0, 9, 6, 11, 0, 9, 7, 8, 9, 7, 3, 9, 
7, 8, 2, 9, 7, 11, 21, 9, 6, 11, 9, 7), Severity = c(0, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 
1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 
0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("Study_number", 
"Vessel", "Segment", "Severity"), row.names = c(NA, -250L), class = c("tbl_df", 
"tbl", "data.frame"))
实际数据帧如下所示:

    Study_number Vessel Segment Severity
          <dbl>  <dbl>   <dbl>    <dbl>
1             1      1       3        0
2             1      2       9        0
3             1      3       7        0
4             1      4       8        0
5             2      1       2        0
6             2      2       9        0
7             2      3       7        0
8             2      4       8        0
9             3      2       9        0
10            3      3       7        1
  Study_number Vessel Segment Severity Vessel_Severity
         <dbl>  <dbl>   <dbl>    <dbl>           <chr>
1            1      1       3        0             1-0
2            1      2       9        0             2-0
3            1      3       7        0             3-0
4            1      4       8        0             4-0
5            2      1       2        0             1-0
6            2      2       9        0             2-0
之后,我使用以下函数将“是”或“否”分配给“总体严重疾病”列(如果任何行至少有一个“1”,则在参与者级别将其分配为“是”)

#9

但是如果我更改ifelse的顺序,并将最后一个条件放在嵌套的ifelse语句的开头(
ifelse(sum(Severity)>=3
),那么ddply将不会应用除此之外的其余语句,我将得到一个完全低估的结果(5个唯一参与者,而不是9个)

x=3,1,,
否则(血管严重程度='2-1',1,
ifelse(血管_严重程度='3-1'和段%c(6,7)和总和(严重程度==2,1,0)))
x=1,‘是’、‘否’)
长度(唯一(x$研究编号[x$总体\严重\疾病=='Yes']))
#5


我对这种行为感到困惑。如果您能提供一些建议和澄清,我将不胜感激。

在您的示例中,您应该替换

    x$Vessel_Severity -> paste(x$Vessel, x$Severity, sep = '-')


x$Vesser\u谢谢你,塞德里克。我用正确的赋值运算符进行了编辑。你完全正确。应该是9和5。我包含的可复制数据集是从一个更大的数据集截断的,这就是我最初提到的数字不同的原因。你的问题很好。您可以用另一种方法使用tapply对严重性求和,然后合并回初始数据帧。通过这种方式,您可以知道您的总和(严重性)是2还是总和等于或大于3。但问题是,这并不能回答你的问题。
library(plyr)
x <- ddply(x, 'Study_number', transform,
Overall_severe_disease = ifelse(Vessel_Severity == '3-1' &  Segment %in% c(6,7) & sum(Severity) == 2 , 1,
       ifelse(Vessel_Severity == '2-1', 1,
       ifelse(sum(Severity) >= 3, 1, 0))))
x <- ddply(x, 'Study_number', transform, Overall_severe_disease = ifelse(sum(Overall_severe_disease) >= 1, 'Yes', 'No'))
length(unique(x$Study_number[x$Overall_severe_disease=='Yes']))
x <- ddply(x, 'Study_number', transform,
           Overall_severe_disease = ifelse(sum(Severity) >= 3, 1,
                                    ifelse(Vessel_Severity == '2-1', 1,
                                   ifelse(Vessel_Severity == '3-1' &  Segment %in% c(6,7) & sum(Severity) == 2 , 1 , 0))))

x <- ddply(x, 'Study_number', transform, Overall_severe_disease = ifelse(sum(Overall_severe_disease) >= 1, 'Yes', 'No'))

length(unique(x$Study_number[x$Overall_severe_disease=='Yes']))
    x$Vessel_Severity -> paste(x$Vessel, x$Severity, sep = '-')
    x$Vessel_Severity <- paste(x$Vessel, x$Severity, sep = '-')
    # first example
    x$Overall_severe_disease<-0
    x <- ddply(x, 'Study_number', transform,
            Overall_severe_disease = ifelse(Vessel_Severity == '3-1' &  Segment %in% c(6,7) & sum(Severity) == 2 , 1, 0))
    sum(x$Overall_severe_disease) #4

    x <- ddply(x, 'Study_number', transform,
    Overall_severe_disease = ifelse(Vessel_Severity == '3-1' &  Segment %in% c(6,7) & sum(Severity) == 2 , 1, ifelse(Vessel_Severity == '2-1', 1,0)))
    sum(x$Overall_severe_disease) #4

    x <- ddply(x, 'Study_number', transform,
            Overall_severe_disease = ifelse(Vessel_Severity == '3-1' &  Segment %in% c(6,7) & sum(Severity) == 2 , 1,
                    ifelse(Vessel_Severity == '2-1', 1,
                            ifelse(sum(Severity) >= 3, 1, 0))))
    sum(x$Overall_severe_disease) #24
    res<-tapply(x$Overall_severe_disease,x$Study_number,sum)
    length(res[res>0])#9
    x <- ddply(x, 'Study_number', transform, Overall_severe_disease = ifelse(sum(Overall_severe_disease) >= 1, 'Yes', 'No'))
    length(unique(x$Study_number[x$Overall_severe_disease=='Yes'])) #9

    # second example

    x <- ddply(x, 'Study_number', transform,
        Overall_severe_disease = ifelse(sum(Severity) >= 3, 1, 0))
    sum(x$Overall_severe_disease) #20 

    x <- ddply(x, 'Study_number', transform,
            Overall_severe_disease = ifelse(sum(Severity) >= 3, 1, ifelse(Vessel_Severity == '2-1', 1,0)))
    sum(x$Overall_severe_disease) #20 

    x <- ddply(x, 'Study_number', transform,
            Overall_severe_disease = ifelse(sum(Severity) >= 3, 1,
                    ifelse(Vessel_Severity == '2-1', 1,
                            ifelse(Vessel_Severity == '3-1' &  Segment %in% c(6,7) & sum(Severity) == 2 , 1 , 0))))
    sum(x$Overall_severe_disease) #20 
    res<-tapply(x$Overall_severe_disease,x$Study_number,sum)
    length(res[res>0])#5
    x <- ddply(x, 'Study_number', transform, Overall_severe_disease = ifelse(sum(Overall_severe_disease) >= 1, 'Yes', 'No'))
    length(unique(x$Study_number[x$Overall_severe_disease=='Yes'])) #5