我有一个带有Money列和Age Group列的数据框。
Money列具有NAs,Age Group列的值范围为1到5.
我想要做的是在AgeGroup列等于某个值时找到Money列的总和。对于这个例子说5。
我一直在尝试使用if语句,但我得到了响应“条件长度> 1且仅使用第一个元素”。
if(df$AgeGroup == 5)
SumOfMoney <- sum(df$Money)
我的问题是我不知道如何将“if”变成“when”。我希望在AgeGroup值为5或3的行或我选择的任何行时将Money列相加。
我相信我的条件是正确的,在计算总和时是否添加第二个if语句?
答案 0 :(得分:3)
我会使用data.table
进行“按组”操作。
library(data.table)
setDT(df)[,list(sm=sum(Money,na.rm=TRUE)),AgeGroup]
这将按组计算金额总和。过滤结果以获得一些组值:
setDT(df)[,list(sm=sum(Money,na.rm=TRUE)),AgeGroup][AgeGroup==4]
答案 1 :(得分:2)
尝试:
library(dplyr)
df %>%
group_by(AgeGroup) %>%
summarise(Money = sum(Money, na.rm = TRUE))
给出了:
#Source: local data frame [5 x 2]
#
# AgeGroup Money
#1 1 1033
#2 2 793
#3 3 224
#4 4 133
#5 5 103
如果您想要为特定AgeGroup
设置子集,可以添加:
... %>% filter(AgeGroup == 5)
答案 2 :(得分:1)
尝试:
let profileVC = UIStoryboard.loadProfileViewController()
如果您希望一次只有一个组的总和,请尝试:
set.seed(7)
df <- data.frame(AgeGroup = sample(1:5, 10, T), Money = sample(100:500, 10))
df[1,2] <- NA
AgeGroup Money
1 5 NA
2 2 192
3 1 408
4 1 138
5 2 280
6 4 133
7 2 321
8 5 103
9 1 487
10 3 224
with(df, tapply(Money, AgeGroup, FUN= sum, na.rm=T))
1 2 3 4 5
1033 793 224 133 103
答案 3 :(得分:0)
我认为以下功能应该可以解决问题。
> AGE <- c(1,2,3,2,5,5)
> MONEY <- c(100,200,300,400,200,100)
> dat <- data.frame(cbind(AGE,MONEY))
> dat
AGE MONEY
1 1 100
2 2 200
3 3 300
4 2 400
5 5 200
6 5 100
> getSumOfGroup <- function(df, group){
+ return(sum(df[AGE == group,"MONEY"]))
+ }
> getSumOfGroup(dat, 5)
[1] 300