gpt4 book ai didi

r - dplyr 总结的变量结果,取决于输出变量命名

转载 作者:行者123 更新时间:2023-12-01 02:02:09 27 4
gpt4 key购买 nike

我正在使用 dplyr包 ( dplyr 0.4.3; R 3.2.3) 用于分组数据的基本摘要 ( summarise ),但得到不一致的结果('sd' 为 NaN,'N' 计数不正确)。更改“名称” "的输出具有可变效果(以下示例)。

迄今为止的结果摘要:

  • plyr包未加载,我知道这可能会导致 dplyr 出现问题如果先加载。
  • 使用或不使用 NA 数据(未显示)获得的结果相同。
  • 问题可以通过使用驼峰命名法变量命名(未显示)或使用名称中没有非字母数字分隔符的输出变量来解决。
  • 仍然根据“。”的组合获得有效结果。或输出列名称中的“_”。

  • 问题:虽然可以解决这个问题,但我是否违反了我违反的基本变量命名规则,或者是否存在需要解决的程序问题?我在总结中看到了其他具有可变行为的问题,但不完全是这样。

    谢谢,马特

    示例数据 :
    library(dplyr)
    df<-data_frame(id=c(1,1,1,2,2,2,3,3,3),
    time=rep(1:3, 3),
    glucose=c(90,150, 200,
    100,150,200,
    80,100,150))

    示例:sd 给出 NaN 和不准确的 n
    df %>% group_by(time) %>%
    summarise(glucose=mean(glucose, na.rm=TRUE),
    glucose.sd=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)))

    time glucose glucose.sd n
    (int) (dbl) (dbl) (int)
    1 1 90.0000 NaN 1
    2 2 133.3333 NaN 1
    3 3 183.3333 NaN 1

    我想知道使用“.”是否有问题。名义上,
    或使用与数据框中相同的名称。从输出中删除现有的 df col 名称可解决此问题
    df %>% group_by(time) %>%
    summarise(avg=mean(glucose, na.rm=TRUE),
    stdv=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)))

    time avg stdv n
    (int) (dbl) (dbl) (int)
    1 1 90.0000 10.00000 3
    2 2 133.3333 28.86751 3
    3 3 183.3333 28.86751 3

    即使保留了“glucose.sd”,删除“glucose”摘要也会修复它
    示例:去除“葡萄糖”后,结果正常
    df %>% group_by(time) %>%
    summarise(glucose.sd=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)))

    time glucose.sd n
    (int) (dbl) (int)
    1 1 10.00000 3
    2 2 28.86751 3
    3 3 28.86751 3

    如果我为第一个摘要添加“glucose.mean”,它工作正常
    df %>% group_by(time) %>%
    summarise(glucose.mean=mean(glucose, na.rm=TRUE),
    glucose.sd=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)))

    time glucose.mean glucose.sd n
    (int) (dbl) (dbl) (int)
    1 1 90.0000 10.00000 3
    2 2 133.3333 28.86751 3
    3 3 183.3333 28.86751 3

    使用不带“.”的变量名时出现同样的错误。
    所以这不仅仅是使用“.”的问题。名义上
    df %>% group_by(time) %>%
    summarise(glucose=mean(glucose, na.rm=TRUE),
    glucose_sd=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)))

    time glucose glucose_sd n
    (int) (dbl) (dbl) (int)
    1 1 90.0000 NaN 1
    2 2 133.3333 NaN 1
    3 3 183.3333 NaN 1

    将“glucose”重命名为“glucose_mean”有效
    df %>% group_by(time) %>%
    summarise(glucose_mean=mean(glucose, na.rm=TRUE),
    glucose_sd=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)))

    time glucose_mean glucose_sd n
    (int) (dbl) (dbl) (int)
    1 1 90.0000 10.00000 3
    2 2 133.3333 28.86751 3
    3 3 183.3333 28.86751 3

    最佳答案

    您在 summarize 中指定的转换按照它们出现的顺序执行,这意味着如果您更改变量值,那么这些新值将出现在后续列中(这与基本函数 tranform() 不同)。当你做

    df %>% group_by(time) %>%
    summarise(glucose=mean(glucose, na.rm=TRUE),
    glucose.sd=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)))
    glucose=mean(glucose, na.rm=TRUE)部分已更改 glucose 的值变量,这样当您计算 glucose.sd=sd(glucose, na.rm=TRUE) 时部分, sd()没有看到原始葡萄糖值,它看到的新值是原始值的平均值。如果您重新排序列,它将起作用。
    df %>% group_by(time) %>%
    summarise(glucose.sd=sd(glucose, na.rm=TRUE),
    n=sum(!is.na(glucose)),
    glucose=mean(glucose, na.rm=TRUE))

    如果您想知道为什么这是默认行为,这是因为创建一个列然后在稍后的转换中使用该列值通常很好。例如,使用 mutate()
    df %>% group_by(time) %>%
    mutate(glucose_sq = glucose^2,
    glucose_sq_plus2 = glucose_sq+2)

    关于r - dplyr 总结的变量结果,取决于输出变量命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35349123/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com