tidyr :: expand()没有添加非常小的数字

时间:2018-06-16 19:49:30

标签: r dplyr tidyr

我有一个data.frame,我想为每一行创建N个新行以及一个新列。它基本上是这样的。对于这1行data.frame,我想将其扩展为180行,由新列probability区分。但是我发现来自pnorm的非常小的数字会被删除。

data.frame(col1='a',col2=2, m = 100, s = 3) %>%
  group_by(col1, col2) %>%
  expand(probability = pnorm(1:180, mean=m, sd=s ,log.p = F)) %>%
  ungroup() %>%
  nrow()

[1] 125

如果我在pnorm切换到记录概率,则会添加所有行。

data.frame(col1='a',col2=2, m = 100, s = 3) %>%
  group_by(col1, col2) %>%
  expand(probability = pnorm(1:180, mean=m, sd=s ,log.p = T)) %>% 
  ungroup() %>% 
  nrow()

[1] 180

但即使使用日志转换,有时仍会丢失一些数字,因此它并不总是出现180行。

1 个答案:

答案 0 :(得分:3)

expand用于创建列的所有唯一组合,并且由于您只指定了一列probability,因此它基本上会删除该列中的所有重复值,因此结果取决于有多少个唯一值生成的列中有;您可以通过打印多少个唯一值并将其与结果中的行数进行比较来仔细检查它:

data.frame(col1='a',col2=2, m = 100, s = 3) %>%
    group_by(col1, col2) %>%
    expand(probability = {
        p <- pnorm(1:180, mean=m, sd=s ,log.p = F)
        print(n_distinct(p))
        p
    }) %>%
    ungroup() %>%
    nrow()
# these two numbers are the same
#[1] 125
#[1] 125

对于您的用例,创建一个列表列然后unnest它应该没问题:

data.frame(col1='a',col2=2, m = 100, s = 3) %>%
    group_by(col1, col2) %>%
    mutate(probability = list(pnorm(1:180, mean=m, sd=s ,log.p = F))) %>%
    unnest %>% dim
# [1] 180   5