【问题标题】:using NSE on spread_ in R tidyr在 R tidyr 中的 spread_ 上使用 NSE
【发布时间】:2016-03-29 10:57:34
【问题描述】:

使用以下数据集:

temp <- structure(list(
  GENDER = structure(c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), 
                     .Label = c("F", "M"), 
                     class = "factor"), 
  EVERFSM_6 = c(0L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L), 
  `0001` = c(0, 11, 22, 33, 33, 55, 66, 77, 88, 0), 
  n = c(20L, 13L, 4L, 13L, 36L, 94L, 28L, 50L, 27L, 1L)), 
  .Names = c("GENDER", "EVERFSM_6", "0001", "n"), 
  class = c("tbl_df", "data.frame"), 
  row.names = c(NA, -10L))

我正在尝试执行以下spread_ 操作来汇总数据:

DiscID <- "0001"
colID <- as.name(DiscID)
cols <- c("GENDER", colID, "n")

gender_results <- temp %>%
  select_(.dots=cols) %>%
  group_by_(.dots=cols[1:2]) %>%
  summarise(gender_n = sum(n)) %>% 
  spread_(paste0("`",DiscID,"`"), "gender_n") %>%
  rename(type = GENDER)

但它说:

Error: Key column '`0001`' does not exist in input.

我必须使用 select_、group_by_ 和 spread_ 的 _ 版本,因为我使用变量来引用列名。所需的输出如下,可通过使用硬编码实现:

spread(`0001`, gender_n) %>%

    type     0    11    22    33    55    66    77    88
  (fctr) (int) (int) (int) (int) (int) (int) (int) (int)
1      F    20    13     4    36    94    28    NA    NA
2      M     1    NA    NA    13    NA    NA    50    27

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我认为您的DiscID 已经可以与spread_ 一起使用,无需paste。这有帮助吗?

    cols <- c("GENDER", colID, "n")
    gender_results <- temp %>%
      select_(.dots=cols) %>%
      group_by_(.dots=cols[1:2]) %>%
      summarise(gender_n = sum(n)) %>% 
      spread_(DiscID, "gender_n") %>%
      rename(type = GENDER)
    

    或者:

    cols <- list(~GENDER, colID, ~n)
    gender_results <- temp %>%
      select_(.dots=cols) %>%
      group_by_(.dots=cols[1:2]) %>%
      summarise(gender_n = sum(n)) %>% 
      spread_(DiscID, "gender_n") %>%
      rename(type = GENDER)
    

    来自NSE vignette in dplyr

    【讨论】:

    • 确实如此!但现在我很困惑为什么 spread_ 接受这个,但 select_ 和 group_by_ 不接受。谢谢!
    • 要使用这种混合变量,cols 可以作为 list(~GENDER, colID, ~n) 传递(来自 dplyr 中的 NSE 小插图)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多