我有两个数据:
info
Fname Lname
Henry H
Rose R
Jacob T
John O
Fred Y
Simon S
Gay T
和
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相等时)。我的输出应该如下所示:
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
,但还没有运气。我只是找不到正确的标识符。还有别的方法可以得到我的输出吗?
发布于 2015-10-17 06:31:48
下面是一种使用基本R
的不太优雅的方法。
现在,合并名称上的框架(尽管在本例中这样做没有什么意义;它实际上只是students
框架中已经存在的名称列表)。
merged_df <- merge(students,info,by=c("Fname","Lname"))
最后,聚合,这里只是在名字上。可以添加任何类别变量或因素变量。
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,
## 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)
发布于 2015-10-17 08:11:59
使用dplyr
library(dplyr)
info %>% left_join(students) %>%
group_by(Fname, Lname) %>%
filter(Age == max(Age))
发布于 2015-10-17 11:12:46
试试这个:
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
中没有数据。在这个问题中,info
和students
的学生是一样的,所以我们可以在查询中省略单词left
,并且仍然得到相同的结果。还要注意的是,由于在info
和students
中出现了完全相同的一组学生,所以我们根本不需要使用info
。除from
行外,这与最后一次查询相同,但对提供的数据给出相同的答案:
sqldf("select Fname, Lname, max(Age) Age, Height, Subject, Result
from students
group by Fname, Lname")
注:用于可再现性如下构造info
和student
数据帧。请在将来提出问题时自己提供这份资料。
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)
https://stackoverflow.com/questions/33183561
复制相似问题