【问题标题】:How to group and ungroup in R?如何在 R 中分组和取消分组?
【发布时间】:2019-11-01 04:52:45
【问题描述】:

我有一个如下所示的数据框

test_df <- data.frame("SN" = c("ABC123","ABC123","ABC123","MNO098","MNO098","MNO098"), 
                      "code" = c("ABC1111","DEF222","GHI133","","MNO1123","MNO567"), 
                      "d_time" = c("2220-08-27","2220-05-27","2220-02-27","2220-11-27","2220-02-27",""))

我正在尝试做两件事

1) 通过从列 SNcode 中删除字母来创建 2 个新列 (p_id,v_id) 并仅保留 9 位数字

2) 根据v_id 为每个人创建一个滞后列 (p_vid),每个人根据他/她的d_time 排序

t_df <- test_df %>% group_by(SN)
t_df %>% arrange((d_time), .by_group = TRUE) ->> sorted_df #sorted based on d_time
transform_ids = function(DF){  # this function is to create person and visit_occurrence ids
  DF %>% 
    mutate(p_id = as.integer(str_remove_all(.$SN,"[a-z]|[A-Z]") %>%   #retaining only the numeric part
                                    str_sub(1,9))) %>%
    mutate(v_id = as.integer(str_remove_all(.$code,"[a-z]|[A-Z]") %>% 
                                              str_sub(1,9))) %>%
    group_by(p_id) %>%
    mutate(pre_vid = lag(v_id)) %>%
    ungroup
}
transform_ids(sorted_df)

但是当我这样做时,我遇到了以下错误

视图中的错误:列 p_id 的长度必须为 3(组大小)或 1,而不是 6 错误:列 p_id 的长度必须为 3(组大小)或 1,而不是 6 另外:警告信息: 在视图中(transform_ids(t_df)): 显示回溯 使用调试重新运行 错误:列 p_id 的长度必须为 3(组大小)或 1,而不是 6

我希望我的输出如下所示。基本上,我试图将一个人的每个v_id 链接到他之前的访问,即p_vid

【问题讨论】:

    标签: r dataframe dplyr purrr tibble


    【解决方案1】:

    要生成p_idv_id 列,只需使用sub

    t_df$p_id <- gsub("[A-Z]+", "", t_df$SN)
    t_df$v_id <- gsub("[A-Z]+", "", t_df$code)
    

    对于p_vid 列,请使用dplyr 包中的lag()

    t_df %>%
    group_by(p_id) %>%
    mutate(p_vid = lag(v_id, order_by=d_time, default=0))
    

    上面的输出实际上给了你一个小标题。如果你想要一个数据框,只需使用:

    t_df <- as.data.frame(t_df)
    

    输出:

      SN     code    d_time     p_id  v_id  p_vid
      <fct>  <fct>   <fct>      <chr> <chr> <chr>
    1 ABC123 ABC1111 2220-08-27 123   1111  222  
    2 ABC123 DEF222  2220-05-27 123   222   133  
    3 ABC123 GHI133  2220-02-27 123   133   0    
    4 MNO098 ""      2220-11-27 098   ""    1123 
    5 MNO098 MNO1123 2220-02-27 098   1123  567  
    6 MNO098 MNO567  ""         098   567   0    
    

    【讨论】:

    • 我们不是必须取消分组才能将输出作为数据帧吗?我想将处理后的数据帧传递给另一个函数
    • 另外,你能看到我更新后的预期输出吗?
    • 你的代码也做同样的事情/产生同样的输出。对吗?
    • 我收回它,你的预期输出现在看起来对我来说是正确的。
    • 嗨 @Tim Biegeleisen - 如何将剥离后的字符数限制为 9。如果您在我的代码中看到,我使用了 0-9。同样,您能告诉我如何在 gsub 中执行此操作吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2017-03-21
    • 2019-12-06
    相关资源
    最近更新 更多