R 如何按“过滤”;以“开始?”;?
如果我有以下data.frame,它有两列(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",
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