找到两个数据帧的交集并计算数据帧中整数行的平均值

时间:2015-02-25 14:14:00

标签: r dataframe apply

我有两个包含idscorestudentName的数据框。

我想创建一个仅包含 idtest1test2的数据框。然后,我想平均学生的分数。

以下是一些示例数据:

test1 <- data.frame(id = numeric(0), score = integer(0), studentName = character(0), stringsAsFactors = FALSE)
test1[1, ] <- c(1, 100, "Alice")
test1[2, ] <- c(2, 98, "Bob")
test1[3, ] <- c(3, 64, "Josh")
test1[4, ] <- c(4, 84, "Jake")

test2 <- data.frame(id = numeric(0), score = integer(0), studentName = character(0), stringsAsFactors = FALSE)
test2[1, ] <- c(1, 90, "Alice")
test2[2, ] <- c(2, 95, "Bob")
test2[3, ] <- c(3, 80, "Josh")
test2[4, ] <- c(10, 50, "Emma")

输出应该是包含以下行的数据框:

  • (1,95,“Alice”)
  • (2,96.5,“Bob”)
  • (3,72,“Jake”)

请注意id4的学生10被省略,因为它们不会同时出现在test1test2中。

我正在考虑在applyintersection中使用mean函数,但我不确定如何设置它。

2 个答案:

答案 0 :(得分:2)

base R中,您可以使用mergerowMeans(假设是{。}} &#39;得分&#39;列是数字&#39;)。

 res <- merge(test1, test2[-1], by='studentName')
 res
 #   studentName id score.x score.y
 #1       Alice  1     100      90
 #2         Bob  2      98      95
 #3        Josh  3      64      80

我们感兴趣的是对列的行进行平均&#34; score.x&#34;和&#34; score.y&#34;,这是&#34; res&#34中的第3和第4列;。 rowMeans获取这些列(rowMeans(res[,3:4]))的行的平均值。

 res$score <- rowMeans(res[,3:4])

如果我们不需要&#34; score.x&#34;和&#34; score.y&#34;,我们可以通过否定索引-c(3:4)-(3:4)

将其删除
 res[-(3:4)]
 #   studentName id score
 #1       Alice  1  95.0
 #2         Bob  2  96.5
 #3        Josh  3  72.0

答案 1 :(得分:2)

使用library(dplyr)

df <- inner_join(test1,test2[,-3],by="id")
df <- df %>% mutate(mean_score = (score.x + score.y)/2) %>% select(-c(score.x,score.y))

如果您加载magrittr包,则可以使用%&lt;&gt;%运算符简化第二行:

df %<>% mutate(mean_score = (score.x + score.y)/2) %>% select(-c(score.x,score.y))