如何通过条件将某些列从数据框合并到另一个列

时间:2017-06-13 16:18:30

标签: r

我有两个数据帧: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

感谢您的帮助。

1 个答案:

答案 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