在没有循环的情况下将列添加到数据框的正确方法

时间:2016-06-17 23:04:00

标签: r dataframe

我有这个“d”数据框,有2组。在现实生活中,我有20个团体。

d= data.frame(group = c(rep("A",10),rep("B",10),"A"), value = c(seq(1,10,1),seq(101,110,1),10000))
d
       group value
    1      A     1
    2      A     2
    3      A     3
    4      A     4
    5      A     5
    6      A     6
    7      A     7
    8      A     8
    9      A     9
    10     A    10
    11     B   101
    12     B   102
    13     B   103
    14     B   104
    15     B   105
    16     B   106
    17     B   107
    18     B   108
    19     B   109
    20     B   110
    21     A 10000

我想添加2列,“上”和“下”,这些列是在以下GROUP级别计算的。由于只有2个组,我可以像这样手动添加列:

d= data.frame(group = c(rep("A",10),rep("B",10),"A"), value = c(seq(1,10,1),seq(101,110,1),10000))
d
d$upper = ifelse(d$group=="A", quantile(d$value[d$group=="A"])[4]+ 2.5*IQR(d$value[d$group=="A"]), quantile(d$value[d$group=="B"])[4]+ 2.5*IQR(d$value[d$group=="B"])   )
d$lower = ifelse(d$group=="A", quantile(d$value[d$group=="A"])[4]- 2.5*IQR(d$value[d$group=="A"]), quantile(d$value[d$group=="B"])[4]- 2.5*IQR(d$value[d$group=="B"])   )


   group value upper lower
1      A     1    21  -4.0
2      A     2    21  -4.0
3      A     3    21  -4.0
4      A     4    21  -4.0
5      A     5    21  -4.0
6      A     6    21  -4.0
7      A     7    21  -4.0
8      A     8    21  -4.0
9      A     9    21  -4.0
10     A    10    21  -4.0
11     B   101   119  96.5
12     B   102   119  96.5
13     B   103   119  96.5
14     B   104   119  96.5
15     B   105   119  96.5
16     B   106   119  96.5
17     B   107   119  96.5
18     B   108   119  96.5
19     B   109   119  96.5
20     B   110   119  96.5
21     A 10000    21  -4.0

但是当我有20或30列时,最好的方法是在不进行循环的情况下添加这些列?

1 个答案:

答案 0 :(得分:1)

使用dplyr的{​​{1}}函数

可以轻松完成分组操作
group_by

这会将数据框拆分为“group”变量,然后分别为每个组计算“upper”和“lower”列。