【问题标题】:index table by name in RR中按名称索引表
【发布时间】:2014-07-31 19:59:59
【问题描述】:

我在使用数据集时遇到问题。 数据如下所示:

>data
      name L1
1   TSS200  1
2   TSS200  1
3   TSS200  1
4   TSS200  1
5   TSS200  2
6   TSS200  3
7  TSS1500  4
8  TSS1500  4
9  TSS1500  4
10  TSS200  4
11  TSS200  5
12   5'UTR  6
13  TSS200  6

我想根据 L1 以递增的方式索引该值。比如L1=1,有4行,所以索引是1到4;那么对于L1=2,只有一行,所以索引为1; L2=3,只有一行,索引为1;等等。输出这样的表格:

      name L1 Index
1   TSS200  1 1
2   TSS200  1 2
3   TSS200  1 3
4   TSS200  1 4
5   TSS200  2 1
6   TSS200  3 1
7  TSS1500  4 1
8  TSS1500  4 2
9  TSS1500  4 3
10  TSS200  4 4
11  TSS200  5 1
12   5'UTR  6 1
13  TSS200  6 2

我希望我已经清楚地说明了这个问题。并提前致谢。

【问题讨论】:

  • 您能否澄清一下是什么决定了该指数的价值?我不明白基本原理。
  • @SpringMeister 我对我的帖子做了一些更改。谢谢!
  • 谢谢,现在清楚多了
  • 最经典的方法是?ave:ave(DF$L1, DF$L1, FUN = seq_along)

标签: r indexing


【解决方案1】:

如果 L1 一直在增加,这将起作用。答案假设您有一个名为 d

的数据框
data.frame(d, Index = unlist(mapply(seq, 1, rle(d$L1)$lengths)))

      name L1 Index
1   TSS200  1     1
2   TSS200  1     2
3   TSS200  1     3
4   TSS200  1     4
5   TSS200  2     1
6   TSS200  3     1
7  TSS1500  4     1
8  TSS1500  4     2
9  TSS1500  4     3
10  TSS200  4     4
11  TSS200  5     1
12   5'UTR  6     1
13  TSS200  6     2

【讨论】:

  • mapply 对我来说太下一级了。永远不会理解那个功能
  • @Vlo 这里我多次调用seq,我想每次都提供1作为from参数,并提供rle(d$L1)$lengths中的每个值作为to参数转动。和sapply(rle(d$L1)$lengths, function(x) seq(1, x))的思路基本一致
  • 这是一个很好的解释。与大多数其他 *apply 基本 R 中的系列函数相反,FUN 是第一个参数,有什么原因吗?
  • 认为mapply 的功能与do.call 相似,这是有道理的。
【解决方案2】:

使用dplyr

library(dplyr)

data %>% 
  group_by(L1) %>%
  mutate(Index = row_number())

#Source: local data frame [13 x 3]
#Groups: L1
#
#      name L1 Index
#1   TSS200  1     1
#2   TSS200  1     2
#3   TSS200  1     3
#4   TSS200  1     4
#5   TSS200  2     1
#6   TSS200  3     1
#7  TSS1500  4     1
#8  TSS1500  4     2
#9  TSS1500  4     3
#10  TSS200  4     4
#11  TSS200  5     1
#12   5'UTR  6     1
#13  TSS200  6     2

【讨论】:

    【解决方案3】:

    ave 在组内应用一个函数并返回一个相等长度的向量,所以seq_along 就是你想要的:

      dat$Index <- ave( dat$L1 , dat$L1, FUN=seq_along)
    
    > dat
          name L1 Index
    1   TSS200  1     1
    2   TSS200  1     2
    3   TSS200  1     3
    4   TSS200  1     4
    5   TSS200  2     1
    6   TSS200  3     1
    7  TSS1500  4     1
    8  TSS1500  4     2
    9  TSS1500  4     3
    10  TSS200  4     4
    11  TSS200  5     1
    12   5'UTR  6     1
    13  TSS200  6     2
    

    【讨论】:

      【解决方案4】:

      data.table 接近(当然!)

      library(data.table)
      setDT(data)[, Index := seq_len(.N), by = L1]
      
             name L1 Index
       1:  TSS200  1     1
       2:  TSS200  1     2
       3:  TSS200  1     3
       4:  TSS200  1     4
       5:  TSS200  2     1
       6:  TSS200  3     1
       7: TSS1500  4     1
       8: TSS1500  4     2
       9: TSS1500  4     3
      10:  TSS200  4     4
      11:  TSS200  5     1
      12:   5'UTR  6     1
      13:  TSS200  6     2
      

      【讨论】:

        【解决方案5】:

        有一个方便的sequence 函数。

        > data$Index <- sequence(rle(data$L1)$lengths)
        

        > data$Index <- sequence(table(data[-1]))
        

        两者都产生

        > data
              name L1 Index
        1   TSS200  1     1
        2   TSS200  1     2
        3   TSS200  1     3
        4   TSS200  1     4
        5   TSS200  2     1
        6   TSS200  3     1
        7  TSS1500  4     1
        8  TSS1500  4     2
        9  TSS1500  4     3
        10  TSS200  4     4
        11  TSS200  5     1
        12   5'UTR  6     1
        13  TSS200  6     2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-17
          • 2018-07-08
          • 1970-01-01
          • 1970-01-01
          • 2018-08-01
          • 1970-01-01
          相关资源
          最近更新 更多