2015-06-14 3 views
1

У меня есть дата-рамка с колонкой «Деньги» и столбцом «Возрастная группа».Если утверждения и логические операторы в R

колонок Денег Nas и столбец Возрастной группы имеет значение, которые варьируются от 1 до 5.

То, что я хочу сделать, это найти сумму столбца денег, если столбец равен возрастной группы определенного значения. Скажем 5 для этого примера.

Я пытаюсь использовать оператор if, но получаю ответ «условие имеет длину> 1, и будет использоваться только первый элемент».

if(df$AgeGroup == 5) 
SumOfMoney <- sum(df$Money) 

Моя проблема: я не знаю, как превратить «если» в «когда». Я хочу суммировать столбец «Деньги», когда те строки, которые имеют значение AgeGroup 5 или 3, или что-то другое, что я выбираю.

Я считаю, что у меня есть правильное условие, добавляю ли второе выражение if при вычислении суммы?

+0

Получение ошибки в unique.default (x, nmax = nmax): unique() применяется только к векторам – Jeff

+0

'с (df, tapply (Money, AgeGroup, sum))' должно быть лучше –

+1

@Jeff Вы должны добавить воспроизводимый пример . Это позволит избежать других, чтобы дать вам точное решение. – agstudy

ответ

1

Try:

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 

Если вы хотите просто сумму одной группы в момент попытки:

sum(df[df$AgeGroup == 5,"Money"], na.rm=T) 
[1] 103 
+0

точные цифры не имеют значения. структура надгробия одна и та же. Если ОП получал другой результат, а расчет был точкой торможения, вывод цифр должен был бы быть равен. –

+0

Это, вероятно, ответ, если он хочет получить сумму по всем группам, но если ему нужно только для одной группы, тогда достаточно «sum» (df [df $ AgeGroup == 5, «Деньги»], na.rm = T) ' , – Molx

+0

Согласен. Будем добавлять. –

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 
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] 
2

Try:

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)

Смежные вопросы