R中的If语句和逻辑运算符

R中的If语句和逻辑运算符,r,R,我有一个数据框,其中有一个Money列和一个Age Group列 “货币”列有NAs,而“年龄组”列的值范围为1到5 我想做的是,当年龄组列等于某个值时,求Money列的总和。这个例子说5 我一直试图使用if语句,但得到的响应是条件的长度大于1,并且只使用第一个元素 if(df$AgeGroup == 5) SumOfMoney <- sum(df$Money) 我的问题是我不知道如何将if转换为when。当这些行的年龄组值为5、3或我选择的任何值时,我想对Money列求和 我相信我的条

我有一个数据框,其中有一个Money列和一个Age Group列

“货币”列有NAs,而“年龄组”列的值范围为1到5

我想做的是,当年龄组列等于某个值时,求Money列的总和。这个例子说5

我一直试图使用if语句,但得到的响应是条件的长度大于1,并且只使用第一个元素

if(df$AgeGroup == 5)
SumOfMoney <- sum(df$Money)
我的问题是我不知道如何将if转换为when。当这些行的年龄组值为5、3或我选择的任何值时,我想对Money列求和

我相信我的条件是正确的,在计算总和时是否添加第二个if语句?

尝试:

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 
尝试:


我认为下面的函数应该可以做到这一点

> 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

我认为下面的函数应该可以做到这一点

> 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
我将使用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]
我将使用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]
尝试:

其中:

#Source: local data frame [5 x 2]
#
#  AgeGroup Money
#1        1  1033
#2        2   793
#3        3   224
#4        4   133
#5        5   103
如果要为特定年龄组创建子集,可以添加:

…%>%filterAgeGroup==5

尝试:

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 
其中:

#Source: local data frame [5 x 2]
#
#  AgeGroup Money
#1        1  1033
#2        2   793
#3        3   224
#4        4   133
#5        5   103
如果要为特定年龄组创建子集,可以添加:


…%>%filterAgeGroup==5

在unique.defaultx中获取错误,nmax=nmax:unique仅适用于向量swithdf、tapplyMoney、AgeGroup、sum应为better@Jeff您应该添加一个可复制的示例。这将避免帮助其他人给出确切的解决方案。你要寻找的可能不是if语句,而是基于条件的子集。例如,sumdf[df$AgeGroup==5,Money],na.rm=TOk将对子集进行一些研究。感谢您的帮助。在unique.defaultx中获取错误,nmax=nmax:unique仅适用于向量swithdf、tapplyMoney、AgeGroup、sum应为better@Jeff您应该添加一个可复制的示例。这将避免帮助其他人给出确切的解决方案。你要寻找的可能不是if语句,而是基于条件的子集。例如,sumdf[df$AgeGroup==5,Money],na.rm=TOk将对子集进行一些研究。谢谢你的帮助。准确的数字不重要。总体结构是相同的。如果OP得到不同的结果,并且计算是关键点,那么数字输出必须相等。如果他想要所有组的总和,这可能是答案,但是如果他只需要一个组,那么sumdf[df$AgeGroup==5,Money],na.rm=T就足够了。欢迎您。我加了种子。Molx很好的建议。杰夫,如果你觉得答案有帮助,请检查左侧投票按钮下方的v形箭头以接受答案。准确的数字无关紧要。总体结构是相同的。如果OP得到不同的结果,并且计算是关键点,那么数字输出必须相等。如果他想要所有组的总和,这可能是答案,但是如果他只需要一个组,那么sumdf[df$AgeGroup==5,Money],na.rm=T就足够了。欢迎您。我加了种子。Molx很棒的建议。杰夫,如果你觉得答案很有帮助,请检查左侧投票按钮下方的v形箭头以接受答案。