按组选择数据框中的最高值

Cah*_*ora 5 r dataframe

我有以下内容 df

dat <- data.frame(Cases = c("Student3","Student3","Student3","Student1","Student1",
"Student2","Student2","Student2","Student4"), Class = rep("Math", 9),
Scores = c(9,5,2,7,3,8,5,1,7), stringsAsFactors = F)


> dat
   Cases    Class   Scores
1 Student3  Math      9
2 Student3  Math      5
3 Student3  Math      2
4 Student1  Math      7
5 Student1  Math      3
6 Student2  Math      8
7 Student2  Math      5
8 Student2  Math      1
9 Student4  Math      7
Run Code Online (Sandbox Code Playgroud)

另一方面,我有另一个df,其中包含以下信息:

d <- data.frame(Cases = c("Student3", "Student1",
"Student2", "Student4"), Class = rep("Math", 4), stringsAsFactors = F)

    Cases  Class
1 Student3  Math
2 Student1  Math
3 Student2  Math
4 Student4  Math
Run Code Online (Sandbox Code Playgroud)

有了这两个,我想scores为每个提取最高student.所以我的输出看起来像这样:

> dat_output
    Cases  Class   Scores
1 Student3  Math      9
2 Student1  Math      7
3 Student2  Math      8
4 Student4  Math      7
Run Code Online (Sandbox Code Playgroud)

我试过merge但它并没有提取最高的scores.

Ron*_*hah 6

我们可以使用sapply每个Casesin d,子集dat为它Cases并获得max它的分数.

sapply(d$Cases, function(x) max(dat$Scores[dat$Cases %in% x]))

#Student3 Student1 Student2 Student4 
#       9        7        8        7 
Run Code Online (Sandbox Code Playgroud)

将结果作为data.frame获取

transform(d, Scores = sapply(d$Cases, function(x) 
                     max(dat$Scores[dat$Cases %in% x])))

#    Cases Class Scores
# Student3  Math      9 
# Student1  Math      7
# Student2  Math      8
# Student4  Math      7
Run Code Online (Sandbox Code Playgroud)

注意 - 我假设你d是

d <- data.frame(Cases = c("Student3", "Student1",
      "Student2", "Student4"), Class = rep("Math", 4), stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)