repex dplyr summarize 在数据行九上产生错误:为什么?
repex dplyr summarise yields error on data line nine: Why?
我有一个包含 87 个变量和大约 900 万个观察值的数据集。最早几年不收集资料的人数children。我试图为这些家庭估算 children 的价值。下面的函数试图总结育龄妇女与我的估算值之间的比率,以与那些年的人口普查估计值进行比较。当我 运行 下面的代码块在我的完整数据集上时,
library(tidyverse)
mid2 %>% filter(year < 1968) %>%
group_by(hh_id) %>%
summarise(hh_fem = .data$n_fem * (.data$pernum == 1),
hh_kids = .data$n_kids * (.data$pernum == 1)) %>%
summarise(tot_fem = sum(hh_fem),
totkids = sum(hh_kids)) -> fk
得到这个错误:
Error in summarise_impl(.data, dots) :
Column `hh_fem` must be length 1 (a summary value), not 2
对 1968 年之前年份的初始限制将行限制为前 400 多千行。只看前五行,我没有得到错误和我期望的答案。通过反复试验,我确定我可以只用前九行重现错误,并且只重现函数中引用但未在此处创建的变量。这些行转载如下。该函数在行 1:8.
上正常工作
smidgen <- select(mid2[9, ], year, hh_id, n_fem, pernum, numprec, n_kids)
smidgen
# A tibble: 9 x 6
# Groups: hh_id [8]
year hh_id n_fem pernum numprec n_kids
<dbl> <chr> <int> <dbl> <dbl> <dbl>
1 1962 1962300001 1 1 1 0.9466731
2 1962 1962300002 0 1 1 0.0000000
3 1962 1962300003 0 1 1 0.0000000
4 1962 1962300004 0 1 1 0.0000000
5 1962 1962300005 0 1 1 0.0000000
6 1962 1962300006 0 1 1 0.0000000
7 1962 1962300007 0 1 1 0.0000000
8 1962 1962300008 2 1 2 1.8933462
9 1962 1962300008 2 2 2 1.8933462
确实,我仅从第 8:9 行生成了相同的错误。但是,不是从第 8 行或第 9 行中单独获取的。
我在第 9 行没有看到任何导致此问题的内容。实际上,我看不出第 9 行中的任何值如何改变 hh_fem.
的宽度
非常感谢您的建议和想法。
第一次调用 summarise 时出错:
summarise(hh_fem = .data$n_fem * (.data$pernum == 1)
如果要将变量 pernum
中的观察值过滤为值为 1 的值,则必须先调用 filter()
函数,然后再调用 summarise()
函数
您的代码应该适用于此更改:
mid2 %>% filter(year < 1968) %>%
filter(pernum == 1) %>%
group_by(hh_id) %>%
summarise(hh_fem = n_fem * pernum,
hh_kids = n_kids * pernum) %>%
summarise(tot_fem = sum(hh_fem),
totkids = sum(hh_kids)) -> fk
以后请post一个reprex
以便轻松重现您的问题
我有一个包含 87 个变量和大约 900 万个观察值的数据集。最早几年不收集资料的人数children。我试图为这些家庭估算 children 的价值。下面的函数试图总结育龄妇女与我的估算值之间的比率,以与那些年的人口普查估计值进行比较。当我 运行 下面的代码块在我的完整数据集上时,
library(tidyverse)
mid2 %>% filter(year < 1968) %>%
group_by(hh_id) %>%
summarise(hh_fem = .data$n_fem * (.data$pernum == 1),
hh_kids = .data$n_kids * (.data$pernum == 1)) %>%
summarise(tot_fem = sum(hh_fem),
totkids = sum(hh_kids)) -> fk
得到这个错误:
Error in summarise_impl(.data, dots) :
Column `hh_fem` must be length 1 (a summary value), not 2
对 1968 年之前年份的初始限制将行限制为前 400 多千行。只看前五行,我没有得到错误和我期望的答案。通过反复试验,我确定我可以只用前九行重现错误,并且只重现函数中引用但未在此处创建的变量。这些行转载如下。该函数在行 1:8.
上正常工作smidgen <- select(mid2[9, ], year, hh_id, n_fem, pernum, numprec, n_kids)
smidgen
# A tibble: 9 x 6
# Groups: hh_id [8]
year hh_id n_fem pernum numprec n_kids
<dbl> <chr> <int> <dbl> <dbl> <dbl>
1 1962 1962300001 1 1 1 0.9466731
2 1962 1962300002 0 1 1 0.0000000
3 1962 1962300003 0 1 1 0.0000000
4 1962 1962300004 0 1 1 0.0000000
5 1962 1962300005 0 1 1 0.0000000
6 1962 1962300006 0 1 1 0.0000000
7 1962 1962300007 0 1 1 0.0000000
8 1962 1962300008 2 1 2 1.8933462
9 1962 1962300008 2 2 2 1.8933462
确实,我仅从第 8:9 行生成了相同的错误。但是,不是从第 8 行或第 9 行中单独获取的。
我在第 9 行没有看到任何导致此问题的内容。实际上,我看不出第 9 行中的任何值如何改变 hh_fem.
的宽度非常感谢您的建议和想法。
第一次调用 summarise 时出错:
summarise(hh_fem = .data$n_fem * (.data$pernum == 1)
如果要将变量 pernum
中的观察值过滤为值为 1 的值,则必须先调用 filter()
函数,然后再调用 summarise()
函数
您的代码应该适用于此更改:
mid2 %>% filter(year < 1968) %>%
filter(pernum == 1) %>%
group_by(hh_id) %>%
summarise(hh_fem = n_fem * pernum,
hh_kids = n_kids * pernum) %>%
summarise(tot_fem = sum(hh_fem),
totkids = sum(hh_kids)) -> fk
以后请post一个reprex
以便轻松重现您的问题