首页 > 解决方案 > 在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 函数的方法,但我无法让它工作。我将不胜感激任何输入,非常感谢您!

标签: rfor-loopapply

解决方案


我们可以在矩阵或 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 

推荐阅读