2

この問題は私を困惑させました。

次のデータフレームがあります。

library(dplyr)

# approximation of data frame
x <- data.frame(doy = sample(c(seq(200, 300)), 20, replace = T),
                year = sample(c("2000", "2005"), 20, replace = T), 
                phase = sample(c("pre", "post"), 20, replace = T))

列名を変数として取り、うまく機能する単純な「要約」関数:

 getStats <- function(df, col) {
      col <- as.name(col)
      df %>% 
        group_by(year, phase) %>% 
        summarize(n = sum(!is.na(col)), 
                  mean = mean(col, na.rm = T),
                  sd = sd(col, na.rm = T),
                  se = sd/sqrt(n))
 }

> getStats(x, "doy")
Source: local data frame [4 x 6]
Groups: year [?]

    year  phase     n    mean       sd       se
  <fctr> <fctr> <int>   <dbl>    <dbl>    <dbl>
1   2000   post     8 248.625 30.42526 10.75695
2   2000    pre     2 290.000 14.14214 10.00000
3   2005   post     5 231.400 32.86031 14.69558
4   2005    pre     5 274.200 29.79429 13.32441

ただし、中央値を取得するように関数を変更すると、エラーが返されます。

 getStats <- function(df, col) {
      col <- as.name(col)
      df %>% 
        group_by(year, phase) %>% 
        summarize(n = sum(!is.na(col)), 
                  mean = mean(col, na.rm = T),
                  med = median(col, na.rm = T), # new line 
                  sd = sd(col, na.rm = T),
                  se = sd/sqrt(n))
    }

> getStats(x, "doy")

Error in median (doy, na.rm = TRUE): object "doy" not found

多くの名前と位置の変更を試みましたが、すべて同じ結果が得られました。「median」は、渡された変数として列名を受け入れません。誰かに指摘されたら顔の手のひらを作るような基本的なことが欠けていると思いますが、その間、正気を失っているように感じます. 洞察に感謝します!

4

1 に答える 1