如果R

时间:2015-06-14 21:17:36

标签: r

我有一个带有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语句?

4 个答案:

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