1

我有非常大data.table的东西要以这种方式修剪:

  1. 只有一个唯一的 id

  2. 如果同一日志中有除“X”之外的任何其他数据,则其他应保留

  3. 如果只有 X,那么第一个 X 应该保留

  4. 如果除了“X”之外还有不止一个,那么所有这些都应该保留,用逗号分隔,但不是“X”。

样本数据集:

library(data.table)
dt <- data.table(
    id=c(1,1,2,3,3,4,4,4,5,5),
    log=c(11,11,11,12,12,12,12,12,13,13),
    art=c("X", "Y", "X", "X", "X", "Z", "X", "Y","X", "X")
  )
dt
id log art
1:  1  11   X
2:  1  11   Y
3:  2  11   X
4:  3  12   X
5:  3  12   X
6:  4  12   Z
7:  4  12   X
8:  4  12   Y
9:  5  13   X
10: 5  13   X

所需输出:

 id    log  art    
  1     11   Y    
  2     11   Y
  3     12   Z,Y
  4     12   Z,Y
  5     13   X
4

3 回答 3

2

这是一种方法,尽管可能有更有效的方法。

unique(dt[,.(id, log)])[dt[, .(art=if(.N == 1 | all(art == "X"))
                                      art[1] else toString(unique(art[art != "X"]))),
                           by=log], on="log"]

返回

   id log  art
1:  1  11    Y
2:  2  11    Y
3:  3  12 Z, Y
4:  4  12 Z, Y
5:  5  13    X

通过每个 log 对唯一的 ID 和 log 对执行所需的 art 值的左连接。这假设没有 ID 跨越两个日志,示例中就是这种情况。

于 2017-08-14T13:50:48.577 回答
2

我们能试试

dt[,  .(art = if(all(art=="X")) "X" else 
     toString(unique(art[art != "X"]))), .(id, logbld = log)]
#    id logbld  art
#1:  1     11    Y
#2:  2     11    X
#3:  3     12    X
#4:  4     12 Z, Y
#5:  5     13    X
于 2017-08-14T13:51:17.540 回答
0

只是想试试这个dplyr

library(data.table)
library(dplyr)
   dat <- setDT(dt %>% group_by(id) %>% 
                       unique() %>% 
                       summarise(bldlog = mean(log),
                                 art = gsub("X,|,X", "",paste(art, collapse = ","))))


dat

#    id bldlog art 
# 1:  1     11   Y 
# 2:  2     11   X 
# 3:  3     12   X 
# 4:  4     12 Z,Y 
# 5:  5     13   X
于 2017-08-14T14:02:08.677 回答