【问题标题】:Follow-up: Generalizing a data.frame subsetting function 2后续:泛化一个data.frame子集函数2
【发布时间】:2021-10-08 20:47:27
【问题描述】:

我正在跟进this great answer。在该答案中,foo2 函数帮助用户识别其中唯一的study其他两个选定列group&outcome)中的任何一个常量 em> 或 变化

现在,假设我们想要另外确定是否存在唯一的study,其中所选变量之一 (outcome) 对于某些行是恒定的任何其他选定的变量 (group)。

例如,在study==14 中,outcome 对于group 的某些行是常量。但是在study==8 中,outcome 对于group 的所有行都是完全不同的:

   study group outcome
17    14     1       6
18    14     2       6
19    14     3       7
20    14     4       7

   study group outcome
9      8     1       2
10     8     2       3
11     8     3       4

有没有办法将foo2 扩展到另外识别像study==14 这样的研究?

dat = read.csv("https://raw.githubusercontent.com/rnorouzian/s/main/cf.csv")

study8 = subset(dat, study==8)[1:3]; study14 = subset(dat, study==14)[1:3] 

【问题讨论】:

    标签: r dataframe function dplyr tidyverse


    【解决方案1】:

    我们可以用case_when添加一些条件

    foo2 <- function(dat, study_col, ...) {
       
        dot_cols <- ensyms(...)
        str_cols <- purrr::map_chr(dot_cols, rlang::as_string)
    
        dat %>%
               dplyr::select({{study_col}}, !!! dot_cols) %>%
                dplyr::group_by({{study_col}}) %>%
                dplyr::mutate(grp = across(all_of(str_cols), ~ {
                          tmp <- n_distinct(.)
                          case_when(tmp  == 1 ~ 1, tmp == n() ~ 2, tmp >1 & tmp < n() ~ 3,  TRUE ~ 4)
                          }) %>%
                       purrr::reduce(stringr::str_c, collapse="")) %>%
                    dplyr::ungroup(.) %>%
                     dplyr::group_split(grp, .keep = FALSE)
               
         }
    
    foo2(dat, study, group, outcome)
    

    【讨论】:

    • @rnorouzian 之前只有一个条件,即n_distinct(.) == 1。在这里,您可能需要在多个情况下执行此操作
    • @rnorouzian 在第一种情况下,它检查是否只有一个不同的元素->1,如果所有都是不同的 (==n()) ->2,如果它在 1 和全部之间,则 3 , 所有其他情况 4.
    • @rnorouzian 如果没有其他表达式满足,这是默认情况。默认情况下,它将是 NA
    • @rnorouzian 在这里,我们有 3 个表达式,已经接受了 1、2 和 3。如果您不想要第三个表达式,您可以删除并添加 TRUE ~ 3
    • 亲爱的阿伦博士,这是一个很棒的功能。我有一个问题,当我尝试时:dat &lt;- read.csv("https://raw.githubusercontent.com/ilzl/i/master/j.csv"); out &lt;- foo2(dat, study,group, outcome,time),元素out[[1]]out[[2]]studygroupoutcometime 方面彼此没有区别所以我想知道为什么foo2() 不在其输出中将这些合并在一起? -- 再次感谢。
    猜你喜欢
    • 2021-10-04
    • 2021-10-03
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2014-01-07
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多