这就是我的数据框架的样子
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
')
一旦我确定了特定批次得分最高的行,我想连接Type
和Description
并将它们一直粘贴(从第一行到最后一行的所有元素)分数最高)使用类型和描述之间的换行符和间隙。粘贴完成到该批次得分最高的行,以便它看起来如下所示:
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)中显示所有信息,并为每个批次显示一行。我们非常感谢您的帮助!
答案 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)))
开始,应该很明显如何以编程方式完成。