在 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
我是 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