【问题标题】:R Test Condition For Many Rows多行的 R 测试条件
【发布时间】:2019-04-09 11:26:32
【问题描述】:
d=data.frame("STUDENT"=c(1,2,3,4),
             "SCORE1"=c(64,68,65,65),
             "SCORE2"=c(91,78,94,55),
             "SCORE3"=c(84,62,73,61),
             'IMPROVE'=c('T','T','T','F'))

d$IMPROVE1 = ifelse(d[d$STUDENT==1,d$SCORE1] < d[d$STUDENT==1,d$SCORE2] | d[d$STUDENT==1,d$SCORE3], T, F)

我的目标是为每个学生创造不同的 IMPROVE。如果 STUDENT 的 SCORE2 或 SCORE3 大于 SCORE1,则它等于 T。如果 STUDENT 的 SCORE2 或 SCORE3 不大于 SCORE1,则它等于 F。我给出我的样本数据并尝试。

【问题讨论】:

    标签: r loops


    【解决方案1】:

    你可以这样做:

    d$IMPROVE1 <- FALSE
    d$IMPROVE1[d$SCORE1 < d$SCORE2 | d$SCORE1 < d$SCORE3] <- TRUE
    d
    >  STUDENT SCORE1 SCORE2 SCORE3 IMPROVE IMPROVE1
    1       1     64     91     84       T     TRUE
    2       2     68     78     62       T     TRUE
    3       3     65     94     73       T     TRUE
    4       4     65     55     61       F    FALSE
    

    对于任意数量的分数:

    scores <- grep("SCORE", colnames(d), value = TRUE)[-1]
    sapply(1:nrow(d), function(s) any(d$SCORE1[s] < d[s,scores]))
    

    对于 cmets 中要求的已知分数列:

    column_scores <- 3:4
    column_ref <- 2
    sapply(1:nrow(d), function(s) any(d[s, column_ref] < d[s, column_scores]))
    

    【讨论】:

      【解决方案2】:

      逻辑表达式的输出不需要任何改变

      d$IMPOROVE1 <- with(d, (SCORE1 < SCORE2) | (SCORE1 < SCORE3))
      d$IMPROVE1
      #[1]  TRUE  TRUE  TRUE FALSE
      

      此外,对于多列,矢量化方法将使用 rowSums 从逻辑 matrix 创建逻辑向量,该逻辑是通过将单个列与多个其他“SCORE”列进行比较而创建的

      rowSums(d$SCORE1 < d[grep("SCORE", names(d))][-1]) > 0
      #[1]  TRUE  TRUE  TRUE FALSE
      

      【讨论】:

        【解决方案3】:

        试试这个

        d$IMPROVE1 = ifelse(d$SCORE1 < d$SCORE2 |d$SCORE1 < d$SCORE3, T, F)
        

        【讨论】:

        • 这个不错的@Cettt 假设我有 10 个测试,我可以通过使用 [,] 而不是 col 名称来有效地编码吗?
        • 对不起,我不知道您所说的“使用 [.] 代替”是什么意思。
        • 因此,如果我必须检查 10 个分数的改进情况,我不想必须命名 SCORE1、SCORE2、SCORE3、SCORE4 等等。所以 [,] 我的意思是如果使用位置而不是名称,例如 1:10 而不是 SCORE1 到 SCORE10。
        • 你的意思是想知道第一个分数是否比所有后面的分数都差?
        • 是的,但是有 10+,所以不要每次都写 SCORE,所以基本上将 STUDENT1 的 SCORE1 与 STUDENT1 的所有 OTHER SCORES 进行比较,并为所有学生执行此操作。干杯!
        猜你喜欢
        • 2015-07-18
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 2021-07-07
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        相关资源
        最近更新 更多