我有两个数据帧:df1和df2
df1=read.table(text="group co
A 24952
A 56826865
A 56829677
B 10951
B 24200
B 48557215
B 49537767", header=T, stringsAsFactors=F)
df2=read.table(text="group n1 n2 n3 n4
A 29671 0 46373 0.02
B 51236 0 57911 0.1
A 56483059 121.37 56826203 178.28
B 48497604 164.98 48531024 164.98", header=T, stringsAsFactors=F)
我想通过以下条件将df2
中的第2列:第5列合并到df1
:
df1$group==df2$group & if df1$co < min(df2$n1)
在同一组中,然后将min(df2$n1)
行{2}的第2列:5行合并到df2
中的相应行; df1
,然后将if df1$co > max(df2$n3)
的{{1}}行的第2列:5行合并到max(df2$n1)
中的相应行。结果预计为:
df2
感谢您的帮助。
答案 0 :(得分:1)
使用dplyr
:
require(dplyr)
首先,我修改数据框df2
以了解哪一行是最小行,哪一行是最大行:
df2 %<>% group_by(group) %>%
mutate(cond2 = ifelse(n1 == min(n1), "min", ifelse(n3 == max(n3), "max", NA))) %>%
ungroup
然后,我加入两个数据帧并过滤:
df1 %>% left_join(df2, by = "group") %>%
group_by(group, co) %>%
mutate(cond = ifelse(co < min(n1), "min", ifelse(co > max(n3), "max", NA))) %>%
ungroup %>%
filter(cond == cond2) %>%
select(-cond, -cond2)
给出了输出:
Source: local data frame [7 x 6]
group co n1 n2 n3 n4
1 A 24952 29671 0.00 46373 0.02
2 A 56826865 56483059 121.37 56826203 178.28
3 A 56829677 56483059 121.37 56826203 178.28
4 B 10951 51236 0.00 57911 0.10
5 B 24200 51236 0.00 57911 0.10
6 B 48557215 48497604 164.98 48531024 164.98
7 B 49537767 48497604 164.98 48531024 164.98