根据其他数据框中的数据添加列

Posted

技术标签:

【中文标题】根据其他数据框中的数据添加列【英文标题】:Adding column based on data in other data frame 【发布时间】:2020-08-25 08:02:33 【问题描述】:

我想计算每个学生的平均考试成绩并将其作为新列添加到数据框中:

library(dplyr)

my_students <- c("John", "Lisa", "Sam")
student_exam <- c("John", "Lisa", "John", "John")
score_exam <- c(7, 6, 7, 6)

students <- as.data.frame(my_students)
scores <- as.data.frame(student_exam)
scores <- cbind(scores, score_exam)

new_frame <- students %>% mutate(avg_score = (scores %>% filter(student_exam == my_students) %>% mean(score_exam)))

但上面的代码给出了以下错误:

Error in Ops.factor(student_examn, my_students) : 
  level sets of factors are different

我认为它与 filter(student_exam == my_students) 有关。我将如何在 dplyr 中执行此操作?

【问题讨论】:

不太清楚filter 试图做什么。你所有的学生在你的例子中都有一个分数。这样的事情适用于您的情况:df = data.frame(student_exam, score_exam); df %&gt;% group_by(student_exam) %&gt;% mutate(avg_score = mean(score_exam)) %&gt;% ungroup() @AntoniosK 如果我是正确的,这会将 Sam 从结果中删除。我需要山姆留下来。如果它没有学生的成绩,它应该只是说 NA。 【参考方案1】:

您需要确保定义了两个数据框,其中包含名为“name”的匹配列。然后,您可以使用 group_by 并按学生汇总分数,并汇总每个学生的平均值。此解决方案有一个警告,告诉您应该注意并非班上的每个学生都有平均考试成绩。因此,Sam 的平均得分为 NA。

library(dplyr)

my_students <- c("John", "Lisa", "Sam")
student_exam <- c("John", "Lisa", "John", "John")
score_exam <- c(7, 6, 7, 6)

students <- data.frame("name" = as.character(my_students))
scores <- data.frame("name" = as.character(student_exam), "score" = score_exam)


avg_scores <- scores %>%
  group_by(name) %>%
  summarize(avgScore = mean(score)) %>%
  right_join(students)

【讨论】:

我想将 Sam 保留在结果数据框中。我假设这会删除他?如果 Sam 没有得分,我只想让它说 NA。 @RuudVerhoef 这是这种方法的结果。

以上是关于根据其他数据框中的数据添加列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用streamlit和python根据数据框中的字段数添加列

在数据框中动态添加列,列名作为 List 中的元素

如何将一列添加到由其他列的最小值组成的数据框中?

使用 for 和 if 添加基于数据框中其他列的列值

如何根据在熊猫数据框中的其他列上应用条件来提取列值

根据数据框中的其他行值创建列