data.table(R)粘贴特定行的值,同时按组

时间:2018-06-11 12:30:45

标签: r data.table aggregate

我正在处理一个古怪的问题。 我有一些类似的数据:

dt<-data.table(time = c('13:00','13:00','13:00','13:15','13:15'),group=c('A','A','B','A','B'),code=c('11b','16b','22c','9c','7y'))

        time group code
    1: 13:00     A  11b
    2: 13:00     A  16b
    3: 13:00     B  22c
    4: 13:15     A   9c
    5: 13:15     B   7y

我试图做以下事情。创建一个新列(:= Fgroup),该列在group上进行值调整,并按time进行汇总。 因此,如果group == A,则将值粘贴到code就足够了。如果group == B,我需要按time粘贴代码A(或代码,如果有很多代码),则需要 time group code Fcode 1: 13:00 A 11b 11b 2: 13:00 A 16b 16b 3: 13:00 B 22c 11b,16b 4: 13:15 A 9c 9c 5: 13:15 B 7y 9c

换句话说:

word-wrap:break-word;

任何简单的出路? 谢谢

2 个答案:

答案 0 :(得分:2)

你的意思是拥有这样的东西吗?

library(data.table)

dt[, Fcode := paste(code[group == 'A'], collapse = ","), by = time][group == 'A', Fcode := code]

给出了

> dt
    time group code   Fcode
1: 13:00     A  11b     11b
2: 13:00     A  16b     16b
3: 13:00     B  22c 11b,16b
4: 13:15     A   9c      9c
5: 13:15     B   7y      9c


示例数据:

dt <- data.table(time = c('13:00','13:00','13:00','13:15','13:15'),
                 group= c('A','A','B','A','B'),
                 code = c('11b','16b','22c','9c','7y'))

答案 1 :(得分:1)

仅按时间分组,添加包含所有粘贴代码值的新列。然后将其加入原始表格。按时和组分组并使用ifelse创建新列以使用代码或先前创建的列

dt <- dt[,.(code_temp=paste(ifelse(group!="B",code,""),collapse=", ")), by="time"][
dt, on="time"][
, Fcode := ifelse(group!="B",code,code_temp)][
group=="B",Fcode := substr(Fcode,1,nchar(Fcode)-2)]

最后一段代码删除了逗号。

这符合您对问题的描述和问题中的输出,但我不确定您对C组等的引用。