R中的If语句和逻辑运算符
我有一个数据框,其中有一个Money列和一个Age Group列 “货币”列有NAs,而“年龄组”列的值范围为1到5 我想做的是,当年龄组列等于某个值时,求Money列的总和。这个例子说5 我一直试图使用if语句,但得到的响应是条件的长度大于1,并且只使用第一个元素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列求和 我相信我的条
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形箭头以接受答案。