【问题标题】:Access specific instances in list in dataframe column, and also count list length - R访问数据框列中列表中的特定实例,并计算列表长度 - R
【发布时间】:2018-04-25 21:18:37
【问题描述】:

我有一个由列组成的 R 数据框。一列包含列表:即

      Column
      1,2,4,7,9,0
      5,3,8,9,0
      3,4
      5.8,9,3.5
      6
      NA
      7,4,3

我想创建计算这些列表长度的列:

Column            Count
1,2,4,7,9,0       6
5,3,8,9,0         5
3,4               2
5.8,9,3.5        3
6                1
NA               NA
7,4,3            3

另外,有没有办法访问这些列表中的特定实例?即只用每个列表的第一个实例创建一个新列?还是每个的最后一个实例?

【问题讨论】:

    标签: r


    【解决方案1】:

    一种解决方案是使用strsplit 来拆分字符向量中的元素,并使用sapply 来获得所需的计数:

    df$count <- sapply(strsplit(df$Column, ","),function(x){
      if(all(is.na(x))){
        NA
      } else {
        length(x)
      }
    })
    df
    # Column          count
    # 1 1,2,4,7,9,0     6
    # 2   5,3,8,9,0     5
    # 3         3,4     2
    # 4   5.8,9,3.5     3
    # 5           6     1
    # 6        <NA>    NA
    # 7       7,4,3     3
    

    如果希望将NA 算作1,那么解决方案可能更简单:

    df$count <- sapply(strsplit(df$Column, ","),length)
    

    数据:

    df <- read.table(text = "Column
    '1,2,4,7,9,0'
    '5,3,8,9,0'
    '3,4'
    '5.8,9,3.5'
    '6'
    NA
    '7,4,3'",
    header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

    • 成功了,谢谢!您知道有关访问列表中特定实例的任何信息吗?即从所有最后的实例中制作一列?
    • lengthssapply(x, length) - 例如lengths(strsplit(df$Column, ",")) 的更快速和直接的版本。
    • 类似的方法使用sumis.na,大家最喜欢的NA取幂是sapply(strsplit(df$Column, split=","), function(x) sum(!is.na(x))) * NA^is.na(df$Column)
    【解决方案2】:

    count.fields 用于文本文件,也可以强制使用列:

    df$Count <- count.fields(textConnection(df$Column), sep=",")
    df$Count[is.na(df$Column)] <- NA
    
    df
    #       Column Count
    #1 1,2,4,7,9,0     6
    #2   5,3,8,9,0     5
    #3         3,4     2
    #4   5.8,9,3.5     3
    #5           6     1
    #6        <NA>    NA
    #7       7,4,3     3
    

    一般来说,您最好将列转换为列表,或将数据堆叠为长格式,以使其更易于使用:

    df$Column <- strsplit(df$Column, ",")
    lengths(df$Column)
    #[1] 6 5 2 3 1 1 3
    sapply(df$Column, `[`, 1)
    #[1] "1"   "5"   "3"   "5.8" "6"   NA    "7"  
    
    stack(setNames(df$Column, seq_along(df$Column)))
    #   values ind
    #1       1   1
    #2       2   1
    #3       4   1
    #4       7   1
    #5       9   1
    #6       0   1
    #7       5   2
    #8       3   2
    #9       8   2
    # etc
    

    【讨论】:

      【解决方案3】:

      这是实现相同结果的稍微快一点的方法:

      df$Count <- nchar(gsub('[^,]', '', df$Column)) + 1
      

      这个是通过计算有多少个逗号并加 1 来实现的。

      【讨论】:

        猜你喜欢
        • 2023-01-18
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        相关资源
        最近更新 更多