【问题标题】:Easier function to find elements bigger than a number in each column in R在R中的每一列中查找大于数字的元素的更简单的函数
【发布时间】:2021-07-28 06:51:06
【问题描述】:

我是 R 的初学者,我主要是尝试自学。我找到了一些练习,并给了它一个数据框,并要求找到 3 个成绩小于 8 的学生。

df <- data.frame(Name = c('Ana', 'John', 'Joanna', 'Anna', 'Martin', 'Katrin'), 
                 Age = c(24, 26, 26, 31, 32, 45),
                 Height = c(1.7, 1.82, 1.75, 31, 32, 45), 
                 Gender = c('M', 'M','F', 'F', 'M','F'),
                 stringsAsFactors = FALSE) 

marks <- matrix(c(10,  9, 10,  6,  7,  8,
                  10,  9, 10,  8,  7,  8,
                  8, 10,  9,  7,  7,  7,
                  6,  8,  6,  8,  8,  9,
                  6,  8,  6, 10,  9, 10,
                  7,  6,  8, 10, 10,  8), nrow = nrow(df), ncol = 6)

rownames(marks) <- df$Name
colnames(marks) <- c('Math', 'Physics', 'Arts', 'Chemistry','Biology', 'History')

我做了一个非常简单的解决方案,一个一个地检查,它可以得到正确的答案,但如果我有一个巨大的数据集,绝对不会工作。有人可以帮我找出解决问题的“正确”方法吗?

我的解决方案:

for (i in marks[1,])
  print (i < 8)        
for (i in marks[2,])
  print (i < 8)        
for (i in marks[3,])
  print (i < 8)         
for (i in marks[4,])
  print (i < 8)         
for (i in marks[5,])
  print (i < 8)        
for (i in marks[6,])
  print (i < 8)   

  

我认为应该有一种使用 for 或 apply 函数的方法,但我无法让它工作。我将不胜感激,非常感谢您!

【问题讨论】:

    标签: r for-loop apply


    【解决方案1】:

    我们可以在矩阵或 data.frame 上使用比较运算符来创建逻辑矩阵

    i1 <- marks < 8
    

    -输出

    i1
    #        Math Physics  Arts Chemistry Biology History
    #Ana    FALSE   FALSE FALSE      TRUE    TRUE    TRUE
    #John   FALSE   FALSE FALSE     FALSE   FALSE    TRUE
    #Joanna FALSE   FALSE FALSE      TRUE    TRUE   FALSE
    #Anna    TRUE   FALSE  TRUE     FALSE   FALSE   FALSE
    #Martin  TRUE    TRUE  TRUE     FALSE   FALSE   FALSE
    #Katrin FALSE   FALSE  TRUE     FALSE   FALSE   FALSE
    

    从上面的输出中,如果我们需要每个学生的计数,请使用rowSums

    rowSums(i1)
    #   Ana   John Joanna   Anna Martin Katrin 
    #    3      1      2      2      3      1 
    

    【讨论】:

    • 这太好了,我不知道我可以做这么简单的事情,但我现在已经使用这个解决方案来执行其他任务。谢谢!
    【解决方案2】:

    这是一个创建数据框的选项,以显示“谁在哪个科目上得分低于 8

    idx <- which(marks < 8, arr.ind = TRUE)
    data.frame(
      name = rownames(idx),
      subject = colnames(marks)[idx[, "col"]],
      mark = marks[idx]
    )
    

    给了

         name   subject mark
    1    Anna      Math    6
    2  Martin      Math    7
    3  Martin   Physics    7
    4    Anna      Arts    7
    5  Martin      Arts    7
    6  Katrin      Arts    7
    7     Ana Chemistry    6
    8  Joanna Chemistry    6
    9     Ana   Biology    6
    10 Joanna   Biology    6
    11    Ana   History    7
    12   John   History    6
    

    【讨论】:

    • 这很有效,也让我看到了其他使用它的方式。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2011-01-15
    • 2020-10-26
    相关资源
    最近更新 更多