将带有 if inside 的函数应用于数据框以获取 R 列表中的值

Posted

技术标签:

【中文标题】将带有 if inside 的函数应用于数据框以获取 R 列表中的值【英文标题】:Apply a function with if inside to a dataframe to take a value in a list in R 【发布时间】:2022-01-16 08:41:45 【问题描述】:

大家好,提前感谢您的帮助。

我在 R 中插入了一个名为“project”的 txt 文件。这个名为“data”的数据框由 12 列组成,其中包含 999 个家庭的一些信息。

   head(data)

      im        iw        r am af a1c a2c a3c a4c a5c a6c a7c
1     0.00 20064.970 5984.282  0 38   0   0   0   0   0   0   0
2 15395.61  7397.191    0.000 42 30   1   0   0   0   0   0   0
3 16536.74 18380.770    0.000 33 28   1   0   0   0   0   0   0
4 20251.87 14042.250    0.000 38 38   1   1   0   0   0   0   0
5 17967.04 12693.240    0.000 24 39   1   0   0   0   0   0   0
6 12686.43 21170.450    0.000 62 42   0   0   0   0   0   0   0

im=male income
iw=female income
r=rent
am=male age
af=female age
a1c,a2c....a7c takes the value 1 when there is a child in age under 18
                 and the value 0 when there is not a child in the household.

现在我必须根据一些标准分别计算每个家庭的男性和女性的应税收入,所以我试图创建一个计算 2 个数字的函数,然后在我的数据框上应用这个函数并返回一个列出这些数字。 具体来说,我想要这样的东西:

fact<-function(im,iw,r,am,af,a1c,a2c,a3c,a4c,a5c,a6c,a7c)

 if ((am>0)&&(am<67)&&(af>0)) mti<-im-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((am>0)&&(am<67)&&(af==0)) mti<-im-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((am>=67)&&(af>0)) mti<-im-1000-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((am<=67)&&(af==0)) mti<-im-1000-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af>0)&&(af<67)&&(am>0)) fti<-iw-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af>0)&&(af<67)&&(am==0)) fti<-iw-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af>=67)&&(am>0)) fti<-iw-1000-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af<=67)&&(am==0)) fti<-iw-1000-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 return(mti,fti)

如何修复此功能以应用于我的数据框? 函数可以返回 2 个值吗? 如何应用该功能?

然后我尝试了这个:

fact<-function(im=data$im,iw=data$iw,r=data$r,am=data$am,af=data$af,a1c=data$a1c,a2c=data$a2c,a3c=data$a3c,a4c=data$a4c,a5c=data$a5c,a6c=data$a6c,a7c=data$a7c)


 if ((am>0)&&(am<67)&&(af>0)) mti<-im-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((am>0)&&(am<67)&&(af==0)) mti<-im-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((am>=67)&&(af>0)) mti<-im-1000-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((am<=67)&&(af==0)) mti<-im-1000-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af>0)&&(af<67)&&(am>0)) fti<-iw-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af>0)&&(af<67)&&(am==0)) fti<-iw-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af>=67)&&(am>0)) fti<-iw-1000-(r)/2-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 if ((af<=67)&&(am==0)) fti<-iw-1000-r-(500*(a1c+a2c+a3c+a4c+a5c+a5c+a6c+a7c))
 return(mti,fti)
 



fact(data[1,])

但我有错误:事实上错误(数据[1,]):找不到对象'mti'

当我尝试只为“fti”使用的功能时,可以运行但错误。

【问题讨论】:

要返回多个值,将值放在列表或向量中 - return (c(mti, fti)) 我不能做某事,因为我有这个错误: 事实上的错误(数据[1,]):找不到对象'mti' 【参考方案1】:

除了需要使用c(mti, fti) 返回多个值之外,如果函数中的任何条件都不为真,则您的函数没有默认值。所以,mti 永远不会被创建。

在函数开头添加mti &lt;- NA,因此NA是默认值。

【讨论】:

以上是关于将带有 if inside 的函数应用于数据框以获取 R 列表中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数应用于两列 Pandas 数据框和两列 if 函数

带有 IF 语句的向量函数的 MATLAB 返回

strcmp inside if 在函数内部不起作用

IF ELSE inside Load data infile mysql

如何使用 IF 或 Case 函数来汇总 GROUP_CONCAT 列?然后将其应用于原始数据表?

python pandas:将带有参数的函数应用于系列