首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内连接最大条件型

内连接最大条件型
EN

Stack Overflow用户
提问于 2015-10-17 06:28:26
回答 3查看 70关注 0票数 0

我有两个数据:

代码语言:javascript
运行
复制
info
Fname  Lname
Henry      H
 Rose      R
Jacob      T
 John      O
 Fred      Y
Simon      S
  Gay      T

代码语言:javascript
运行
复制
students
Fname  Lname  Age  Height  Subject Result
Henry      H   12      15 Math;Sci      P
 Rose      R   11      18 Math;Sci      P
Jacob      T   11      15 Math;Sci      P
Henry      H   11      14 Math;Sci      P
 John      O   12      13 Math;Sci      P
 John      O   13      16 Math;Sci      F
 Fred      Y   11      16      Sci      P
Simon      S   12      10 Eng;Math      P
  Gay      T   12      11 Math;Sci      F
 Rose      R   15      18 Math;Sci      P
 Fred      Y   12      16 Math;Sci      P

我想做一个连接,从信息中获取所有的名字,并从学生那里找到相关的元数据。但只选择年龄最高的(当Fname和LName相等时)。我的输出应该如下所示:

代码语言:javascript
运行
复制
Final
Fname Lname Age Height  Subject Result
Henry     H  12     15 Math;Sci      P
 Rose     R  15     18 Math;Sci      P
Jacob     T  11     15 Math;Sci      P
 John     O  13     16 Math;Sci      F
 Fred     Y  12     16 Math;Sci      P
Simon     S  12     10 Eng;Math      P
  Gay     T  12     11 Math;Sci      F

我试过sqldf,但还没有运气。我只是找不到正确的标识符。还有别的方法可以得到我的输出吗?

EN

回答 3

Stack Overflow用户

发布于 2015-10-17 06:31:48

下面是一种使用基本R的不太优雅的方法。

现在,合并名称上的框架(尽管在本例中这样做没有什么意义;它实际上只是students框架中已经存在的名称列表)。

代码语言:javascript
运行
复制
merged_df <- merge(students,info,by=c("Fname","Lname"))

最后,聚合,这里只是在名字上。可以添加任何类别变量或因素变量。

代码语言:javascript
运行
复制
merged_df_max <-aggregate(
                merged_df[c('Age','Height')], 
                by=list(Fname = merged_df$Fname,
                        Lname = merged_df$Lname), 
                FUN=max, na.rm=TRUE)

## add back details to the merged df
result <- merge(merged_df_max,students,by=c("Fname","Lname","Age","Height"))

要从文件中创建data.frame,

代码语言:javascript
运行
复制
## load data
lines <-"
Fname,Lname,Age,Height,Subject,Result
Henry,H,12,15,Math;Sci,P
Rose,R,11,18,Math;Sci,P
Jacob,T,11,15,Math;Sci,P
Henry,H,11,14,Math;Sci,P
John,O,12,13,Math;Sci,P
John,O,13,16,Math;Sci,F
Fred,Y,11,16,Sci,P
Simon,S,12,10,Eng;Math,P
Gay,T,12,11,Math;Sci,F
Rose,R,15,18,Math;Sci,P
Fred,Y,12,16,Math;Sci,P
"

lines2 <-"
Fname,Lname
Henry,H
Rose,R
Jacob,T
John,O
Fred,Y
Simon,S
Gay,T
"

con <- textConnection(lines)
students <- read.csv(con,sep=',')
con2 <- textConnection(lines2)
info <- read.csv(con2,sep=',')
close(con)
close(con2)
票数 2
EN

Stack Overflow用户

发布于 2015-10-17 08:11:59

使用dplyr

代码语言:javascript
运行
复制
library(dplyr)

info %>% left_join(students) %>%
    group_by(Fname, Lname) %>%
    filter(Age == max(Age))
票数 1
EN

Stack Overflow用户

发布于 2015-10-17 11:12:46

试试这个:

代码语言:javascript
运行
复制
library(sqldf)
sqldf("select Fname, Lname, max(Age) Age, Height, Subject, Result 
       from info left join students using (Fname, Lname)
       group by Fname, Lname")

我们使用左联接,以防info中的学生在students中没有数据。在这个问题中,infostudents的学生是一样的,所以我们可以在查询中省略单词left,并且仍然得到相同的结果。还要注意的是,由于在infostudents中出现了完全相同的一组学生,所以我们根本不需要使用info。除from行外,这与最后一次查询相同,但对提供的数据给出相同的答案:

代码语言:javascript
运行
复制
sqldf("select Fname, Lname, max(Age) Age, Height, Subject, Result 
       from students
       group by Fname, Lname")

注:用于可再现性如下构造infostudent数据帧。请在将来提出问题时自己提供这份资料。

代码语言:javascript
运行
复制
Lines_info <- "
Fname  Lname
Henry      H
 Rose      R
Jacob      T
 John      O
 Fred      Y
Simon      S
  Gay      T
"
Lines_students <- "
Fname  Lname  Age  Height  Subject Result
Henry      H   12      15 Math;Sci      P
 Rose      R   11      18 Math;Sci      P
Jacob      T   11      15 Math;Sci      P
Henry      H   11      14 Math;Sci      P
 John      O   12      13 Math;Sci      P
 John      O   13      16 Math;Sci      F
 Fred      Y   11      16      Sci      P
Simon      S   12      10 Eng;Math      P
  Gay      T   12      11 Math;Sci      F
 Rose      R   15      18 Math;Sci      P
 Fred      Y   12      16 Math;Sci      P
"

info <- read.table(text = Lines_info, header = TRUE)
students <- read.table(text = Lines_students, header = TRUE)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33183561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档