使用data-frame / data.table中的换行符连接和粘贴两列

时间:2016-08-12 14:30:55

标签: r data.table concatenation paste

这就是我的数据框架的样子

library(data.table)

    dt <- fread('
       Batch   Score   Type       Description
        A          1   fruit         apple 
        A          2   beverage      pepsi 
        A          3   food          rice
        B          1   beverage      coke
        B          2   fruit         banana
        C          1   food          butter
        D          1   food          bread 
    ')

一旦我确定了特定批次得分最高的行,我想连接TypeDescription并将它们一直粘贴(从第一行到最后一行的所有元素)分数最高)使用类型和描述之间的换行符间隙。粘贴完成到该批次得分最高的行,以便它看起来如下所示:

Batch   Score(Max)        Description2
    A          3        fruit     apple
                        beverage  pepsi
                        food      rice                          
    B          2        beverage  coke
                        fruit     banana                     
    C          1        food      butter
    D          1        food      bread 

批次得分最高的行也恰好是我的数据框中该批次的最后一行。我试过了:

dt[, .(MaxScore = max(Score), 
Description2 = cat(paste(Type, Description), sep="\n")),by = .(Batch)]

目标是在一列(Description2)中显示所有信息,并为每个批次显示一行。我们非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

注意:这并不能完全回答OP的问题。

我做了类似的事情(但不完全一样):

print(x=dt[,{
mx = max(Score)

subdat = .SD[, !"Score", with=FALSE]
newrow0 = lapply(subdat, function(x) as("",class(x)))
newrow  = newrow0
newrow[length(newrow)] = paste0(" Max Score: ", mx)
rbind(
  subdat, 
  newrow,
  newrow0
)
}, by=Batch], nrows=Inf, row.names=FALSE)

给出了

 Batch     Type   Description
     A    fruit         apple
     A beverage         pepsi
     A     food          rice
     A           Max Score: 3
     A                       
     B beverage          coke
     B    fruit        banana
     B           Max Score: 2
     B                       
     C     food        butter
     C           Max Score: 1
     C                       
     D     food         bread
     D           Max Score: 1
     D                       

我只是用它来查看控制台中的数据。我把组的元数据放在一行而不是一列,因为我已经有足够的列几乎跨越了屏幕。

请注意as("", class(x))非常不可靠(例如,不使用Date类)。可能有必要先将整个表强制为字符串。

要将多列打印为一列,请使用sprintf

print(x=dt[,{
mx = max(Score)
subdat = .(
  Description = as.character(Description), 
  Type = as.character(Type)
)
.(mx, sprintf("%10s %15s", subdat$Type, subdat$Description))
}, by=Batch], nrows=Inf, row.names=FALSE)

 Batch V1                         V2
     A  3      fruit           apple
     A  3   beverage           pepsi
     A  3       food            rice
     B  2   beverage            coke
     B  2      fruit          banana
     C  1       food          butter
     D  1       food           bread

这是非常手动的,但从sapply(dt, function(x) max(nchar(x)))开始,应该很明显如何以编程方式完成。