在 R 的每一列中查找大于数字的元素的更简单的函数

Easier function to find elements bigger than a number in each column in R

我是 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 函数的方法,但我无法让它工作。如果有任何意见,我将不胜感激,非常感谢!

我们可以只在矩阵上使用比较运算符或 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 

这是一个创建数据框的选项,用于显示“谁在哪个主题上的得分低于 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