【问题标题】:How to group by unique values in a list in R如何按R中列表中的唯一值分组
【发布时间】:2014-05-11 16:21:39
【问题描述】:

我的数据框有一个类列表变量(str 输出给出:$ X2 :List of 125)。我想按此列表中的唯一值进行分组以执行一些聚合函数,但是当我在 dplyr 中使用 group_by 时,我得到:

Error in eval(expr, envir, enclos) : 
  cannot group column X2, of class 'list':

A.) 有没有办法按列表中的唯一值进行分组?使用 dplyr 或其他一些分组功能? B.) 有没有办法将列表变量转换为具有级别的因子变量?我不需要变量 X2 是一个列表,这就是生成值的方式。但我确实需要能够 group_by 唯一值。

我使用的数据框结构如下:

    'data.frame':   125 obs. of  5 variables:
 $ MOV  : int  -69 -68 -67 -63 -62 -60 -59 -56 -55 -54 ...
 $ X    : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Count: int  1 1 1 1 2 1 1 1 2 1 ...
 $ Perc : num  0.000179 0.000179 0.000179 0.000179 0.000358 ...
 $ X2   :List of 125

我们将不胜感激。

编辑:这是 dput 输出:

structure(list(MOV = c(-69L, -68L, -67L, -63L, -62L, -60L), X = 1:6, 
    Count = c(1L, 1L, 1L, 1L, 2L, 1L), Perc = c(0.000178922884236894, 
    0.000178922884236894, 0.000178922884236894, 0.000178922884236894, 
    0.000357845768473788, 0.000178922884236894), X2 = structure(list(
        range = "[ -69 , -35 )", range = "[ -69 , -35 )", range = "[ -69 , -35 )", 
        range = "[ -69 , -35 )", range = "[ -69 , -35 )", range = "[ -69 , -35 )"), .Names = c("range", 
    "range", "range", "range", "range", "range"))), .Names = c("MOV", 
"X", "Count", "Perc", "X2"), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

  • 您能否提供dput(head(yourdata)) 的输出以使其可重现?
  • 我有一些将列表转换为字符向量的迂回方法的想法,但我希望有一种快速的方法来分组而不更改任何内容。
  • @beginneR 给你:结构(列表(MOV = c(-69L, -68L, -67L, -63L, -62L, -60L), X = 1:6, Count = c (1L, 1L, 1L, 1L, 2L, 1L), Perc = c(0.00, 0.00, 0.00, 0.00, 0.00, 0.00), X2 = structure(list( range = "[ -69 , -35 )", range = "[ -69 , -35 )", 范围 = "[ -69 , -35 )", 范围 = "[ -69 , -35 )", 范围 = "[ -69 , -35 )", 范围 = " [ -69 , -35 )"), .Names = c("range", "range", "range", "range", "range", "range"))), .Names = c("MOV" , "X", "Count", "Perc", "X2"), row.names = c(NA, 6L), class= "data.frame")

标签: r list r-factor


【解决方案1】:

正如您已经发现的那样,无法使用dplyrX2 分组为列表。因此,您可以尝试的一种方法是转换为因子,然后按X2 分组。

如果您的 data.frame 被称为 df,请尝试以下操作:

df$X2 <- as.factor(unlist(df$X2))

之后,您可以使用dplyr 按任何变量(包括X2)进行分组

【讨论】:

    【解决方案2】:

    以下代码可以做到这一点,尤其是在列表列中的某些元素长度大于 2 的情况下。但是它效率不高:如果数据框中既有很多行,又有很多唯一值列出 df$X2,可能需要几个小时。

    首先创建一个仅包含您感兴趣的列表中唯一元素的列表

    ulist <- unique(df$X2)
    

    然后,对于每个唯一元素,确定数据的哪些行具有与该唯一元素匹配的 X2 元素,并为这些行提供一个公共索引(列 id)

    df$id<- rep(NA,nrow(df))
    for(i in 1:length(ulist)){
      
      df$id[df$X2 %in% ulist[i]] <- i
      
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多