首页 > 解决方案 > 使用方程式计算新列的多列

问题描述

我是一个相当新的 R 用户——试图根据论坛、视频和试错法自学。我有一个非常大的数据集,想计算家庭中被视为儿童(18 岁以下)的成员数量。我有一个家庭成员数量的列,以及每个家庭成员年龄的 11 个列。我最初的想法是选择 18 岁以下的人并从家庭成员总数中减去。我尝试了几行不同的代码都没有成功,我不确定如何最好地执行它。任何帮助是极大的赞赏!

在此处输入图像描述

标签: r

解决方案


有几种方法可以做到这一点。我正在使用 libr 包中称为 datastep 的东西。

首先,这是您的数据:

df <- data.frame(num_hhmem = c(6, 4, 4, 5, 4, NA, 8, NA),
                 ChildAge = c(9, 8, 10, 10, 9, NA, 8, NA),
                 hhm2_Age = c(36, 44, 52, 40, 33, NA, 37, NA),
                 hhm3_Age = c(34, 16, 53, 15, 15, NA, 39, NA),
                 hhm4_Age = c(15, 10, 92, 17, 11, NA, NA, NA),
                 hhm5_Age = c(7, NA, NA, 20, NA, NA, 10, NA),
                 hhm6_Age = c(11, NA, NA, NA, NA, NA, 6, NA),
                 hhm7_Age = c(NA, NA, NA, NA, NA, NA, 68, NA),
                 hhm8_Age = c(NA, NA, NA, NA, NA, NA, 78, NA),
                 hhm9_Age = c(NA, NA, NA, NA, NA, NA, NA, NA))

然后我为要迭代的列设置了一个数组的数据步。此外,我还设置了一个值为 0 的 childCount 变量。datastep 将逐行遍历数据帧。因此,您只需遍历数组并将任何子项添加到 childCount 变量。

library(libr)

res <- datastep(df, 
                arrays = list(ages = dsarray("ChildAge", "hhm2_Age", "hhm3_Age",
                                             "hhm4_Age", "hhm5_Age", "hhm6_Age",
                                             "hhm7_Age", "hhm8_Age", "hhm9_Age")),
                calculate = { childCount <- 0 },
                drop = "age",
                {
                  
                  for(age in ages) {

                    if (!is.na(ages[age])) {
                      if (ages[age] < 18)
                        childCount <- childCount + 1
                    
                    }
                  }
                  
                })

结果如下:

res
#   num_hhmem ChildAge hhm2_Age hhm3_Age hhm4_Age hhm5_Age hhm6_Age hhm7_Age hhm8_Age hhm9_Age childCount
# 1         6        9       36       34       15        7       11       NA       NA       NA          4
# 2         4        8       44       16       10       NA       NA       NA       NA       NA          3
# 3         4       10       52       53       92       NA       NA       NA       NA       NA          1
# 4         5       10       40       15       17       20       NA       NA       NA       NA          3
# 5         4        9       33       15       11       NA       NA       NA       NA       NA          3
# 6        NA       NA       NA       NA       NA       NA       NA       NA       NA       NA          0
# 7         8        8       37       39       NA       10        6       68       78       NA          3
# 8        NA       NA       NA       NA       NA       NA       NA       NA       NA       NA          0

推荐阅读