R 如何按“过滤”;以“开始?”;?

R 如何按“过滤”;以“开始?”;?,r,dataframe,filter,sum,R,Dataframe,Filter,Sum,如果我有以下data.frame,它有两列(code和Value): 我有以下几个小组: 第1组=以A开头的所有代码 第2组=以B和C开头的所有代码 我想计算一下: 第1组的值之和 第2组的值之和 每个值相对于其所属组的总值的权重向量,即A111为.2(5除以组1的总值,即25) 获取数据: test <- data.frame(Code = c("A111", "B111", "C111", "D111", "E111", "A222", "B222", "C222", "D222",

如果我有以下data.frame,它有两列(
code
Value
):

我有以下几个小组:

第1组=以A开头的所有代码

第2组=以B和C开头的所有代码

我想计算一下:

  • 第1组的
    值之和
  • 第2组的
    值之和
  • 每个
    相对于其所属组的总
    的权重向量,即A111为.2(5除以组1的总值,即25)
获取数据:

test <- data.frame(Code = c("A111", "B111", "C111", "D111", "E111", "A222", "B222", "C222", "D222", "E222" ),
Value = c(5L, 10L, 15L, 20L, 25L, 30L, 35L, 45L, 55L, 60L),stringsAsFactors=FALSE)
使用
ave
计算各组内的
sum
权重

test$Weight <- test$Value / ave(test$Value,groups,FUN=sum)
test

   Code Value    Weight
1  A111     5 0.0625000
2  B111    10 0.1250000
3  C111    15 0.1111111
4  D111    20 0.1481481
5  E111    25 0.2941176
6  A222    30 0.3750000
7  B222    35 0.4375000
8  C222    45 0.3333333
9  D222    55 0.4074074
10 E222    60 0.7058824

test$Weight所有代码都以A、B或C开头吗?非常感谢!!!,这正是我所需要的,但实际上我需要在我的真实示例中为7个组复制这一点。如果我添加第三个组,比如下面的示例:test您必须使用类似于
ifelse
的内容创建更详细的分组变量-我已经更新了答案。
fl <- substr(test$Code,1,1)
groups <- ifelse(fl %in% c("A","B"), 1,
          ifelse(fl %in% c("C","D"), 2, 
          3))
test$Weight <- test$Value / ave(test$Value,groups,FUN=sum)
test

   Code Value    Weight
1  A111     5 0.0625000
2  B111    10 0.1250000
3  C111    15 0.1111111
4  D111    20 0.1481481
5  E111    25 0.2941176
6  A222    30 0.3750000
7  B222    35 0.4375000
8  C222    45 0.3333333
9  D222    55 0.4074074
10 E222    60 0.7058824