我有两个包含id
,score
和studentName
的数据框。
我想创建一个仅包含 id
和test1
中test2
的数据框。然后,我想平均学生的分数。
以下是一些示例数据:
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")
输出应该是包含以下行的数据框:
请注意id
和4
的学生10
被省略,因为它们不会同时出现在test1
和test2
中。
我正在考虑在apply
和intersection
中使用mean
函数,但我不确定如何设置它。
答案 0 :(得分:2)
在base R
中,您可以使用merge
和rowMeans
(假设是{。}}
&#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))