【问题标题】:Using Dcast in R to transform dataframe在 R 中使用 Dcast 转换数据帧
【发布时间】:2021-03-10 01:15:29
【问题描述】:

我有以下数据框。并且想得到想要的输出

data.frame(df)
num  Name1   Result1 Name2  Result2   Name3  Result3
1    75%      74      100%    101      50%   50
2    75%      73      100%    101      50%   49
3    50%      50      100%    105      125%  128

我尝试使用以下方式进行 Dcast reshape2::dcast(df, num ~ Name1 + Name2 + Name3, value.var=c("Result1", "Result2", "Result3"))

Dcast 的输出接近我想要的输出,但我只希望唯一的“名称”值作为我的新列。我可以想象我可以在使用 Dcast 之前使用聚合来清理表格,但这似乎太过分了?不知道有没有更快的方法?

期望的输出:

num  50%   75%      100%    125%    
1    50    74       101     NA    
2    49    73       101     NA      
3    50    NA       100     128 

如果有任何帮助,我将不胜感激

【问题讨论】:

    标签: r dplyr aggregate tidyr dcast


    【解决方案1】:

    您可以找到有关步骤herehere 的更多信息。

    dat %>% 
      rename_at(vars(matches("[0-9]")),
                ~str_replace(.,"(\\d)(\\w*)","\\2_\\1")) %>% 
      pivot_longer(cols=matches("_"),names_to=c(".value","group"),
                   names_sep="_") %>% 
      dplyr::select(-group) %>% 
      pivot_wider(names_from = "Name",values_from="Result")
    
    # A tibble: 3 x 5
        num `75%` `100%` `50%` `125%`
      <int> <int>  <int> <int>  <int>
    1     1    74    101    50     NA
    2     2    73    101    49     NA
    3     3    NA    105    50    128
    

    或者……

    reshape(dat, idvar="num", direction="long", 
            varying=list(Name=c(2,4,6), Result=c(3,5,7)),
            v.names = c("Name", "Result") ) %>% 
      dplyr::select(-time) %>% 
      dcast(num ~ Name)
        
      num 50% 75% 100% 125%
    1   1  50  74  101   NA
    2   2  49  73  101   NA
    3   3  50  NA  105  128 
    

    【讨论】:

    • 很酷,谢谢!如果其他人看到这个,你需要 library(stringr)
    【解决方案2】:

    获取长格式数据,因此我们在NameResult 两列中有数据。然后我们可以得到宽格式的数据。

    library(dplyr)
    library(tidyr)
    
    df %>%
      pivot_longer(cols = -num, 
                   names_to = '.value', 
                   names_pattern = '([A-Za-z]+)\\d+') %>%
      arrange(readr::parse_number(Name)) %>%
      pivot_wider(names_from = Name, values_from = Result)
    
    #   num   `50%` `75%` `100%` `125%`
    #  <int> <int> <int>  <int>  <int>
    #1     1    50    74    101     NA
    #2     2    49    73    101     NA
    #3     3    50    NA    105    128
    

    【讨论】:

      猜你喜欢
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2014-04-15
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多