简体   繁体   English

如何在 R 中对数据帧进行自定义聚合?

[英]How can I make a custom aggregation of a dataframe in R?

I have a dataframe such as我有一个数据框,例如

group <- c("A", "A", "B", "C", "C")
tx <- c("A-201", "A-202", "B-201", "C-205", "C-206")
feature <- c("coding", "decay", "pending", "coding", "coding")
df <- data.frame(group, tx, feature)

I want to generate a new df with the entries in tx "listed" for each feature.我想为每个功能生成一个新的 df,其中包含 tx 中“列出”的条目。 I want the output to look like我希望输出看起来像

group <- c("A", "B", "C")
coding <- c("A-201", NA, "C-205|C-206")
decay <- c("A-202", NA, NA)
pending <- c(NA, "B-201", NA)
df.out <- data.frame(group, coding, decay, pending)

So far I did not find a means to achieve this via a dplyr function.到目前为止,我还没有找到通过dplyr函数实现这一dplyr方法。 Do I have to loop through my initial df?我必须遍历我的初始 df 吗?

You may get the data in wide format using tidyr::pivot_wider and use a function in values_fn -您可以使用得到广泛格式的数据tidyr::pivot_wider和使用功能values_fn -

df.out <- tidyr::pivot_wider(df, names_from = feature, values_from = tx, 
         values_fn = function(x) paste0(x, collapse = '|'))

df.out

# group coding      decay pending
#  <chr> <chr>       <chr> <chr>  
#1 A     A-201       A-202 NA     
#2 B     NA          NA    B-201  
#3 C     C-205|C-206 NA    NA     

Here is an alternative way:这是另一种方法:

library(dplyr)
library(tidyr)

df %>% 
  group_by(group, feature) %>% 
  mutate(tx = paste(tx, collapse = "|")) %>% 
  distinct() %>% 
  pivot_wider(
    names_from = feature, 
    values_from = tx
  )
  group coding      decay pending
  <chr> <chr>       <chr> <chr>  
1 A     A-201       A-202 NA     
2 B     NA          NA    B-201  
3 C     C-205|C-206 NA    NA    

Using dcast from data.table使用dcastdata.table

library(data.table)
dcast(setDT(df), group ~ feature, value.var = 'tx', 
   function(x) paste(x, collapse = "|"), fill = NA)
   group      coding decay pending
1:     A       A-201 A-202    <NA>
2:     B        <NA>  <NA>   B-201
3:     C C-205|C-206  <NA>    <NA>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM