将 data.frame 拆分为包含一对的较小 data.frame 的列表

Sim*_*mel 2 r function dataframe dplyr tidyverse

我想知道如何分割data下面的数据,以便我得到一个较小的 dataf.rames 列表,每个数据帧type中都包含一对唯一的?

我的desired_output如下所示。

请注意,这只是一个玩具数据,因此type可以是任何其他变量。另请注意,如果某个特定项type只有一行(例如type == 4),我想通过警告排除它:

type 4 has just one row thus is excluded.

m=
"
  obs   type
    1   1
    2   1
    3   a
    4   a
    5   3
    6   3
    7   4
"
data <- read.table(text = m, h=T)


desired_output <-list(
  
  data.frame(obs=1:4,   type=c(1,1,"a","a")),
  
  data.frame(obs=c(1,2,5,6),   type=c(1,1,3,3)),
  
  data.frame(obs=3:6,   type=c("a","a",3,3))
)

# warning: type 4 has just one row thus is excluded.
Run Code Online (Sandbox Code Playgroud)

Ron*_*hah 5

这是基本 R 函数 -

return_list_data <- function(data, type) {
  unique_counts <- table(data[[type]])
  single_count <- names(unique_counts[unique_counts == 1])
  if(length(single_count)) {
    warning(sprintf('%s %s has just one row thus is excluded.', type, toString(single_count)))
  }
  multiple_count <- names(unique_counts[unique_counts > 1])
  
  combn(multiple_count, 2, function(x) {
    data[data[[type]] %in% x, ]
  }, simplify = FALSE)  
}
Run Code Online (Sandbox Code Playgroud)

这返回 -

return_list_data(data, 'type')

#[[1]]
#  obs type
#1   1    1
#2   2    1
#5   5    3
#6   6    3

#[[2]]
#  obs type
#1   1    1
#2   2    1
#3   3    a
#4   4    a

#[[3]]
#  obs type
#3   3    a
#4   4    a
#5   5    3
#6   6    3

#Warning message:
#In return_list_data(data, "type") :
#  type 4 has just one row thus is excluded.
Run Code Online (Sandbox Code Playgroud)

如果没有typewith single row ie ,则不会生成警告return_list_data(data[-7, ], 'type')