R 拆分数据帧并根据特定列对拆分的值进行排序
我有一个如下的数据框R 拆分数据帧并根据特定列对拆分的值进行排序,r,dataframe,R,Dataframe,我有一个如下的数据框 tdf <- structure(list(GO = c("Cytokine-cytokine receptor interaction", "Cytokine-cytokine receptor interaction|Endocytosis", "I-kappaB kinase/NF-kappaB signaling", "NF-kappa B signaling pathway", "NF-kappaB import into nucleus", "T c
tdf <- structure(list(GO = c("Cytokine-cytokine receptor interaction",
"Cytokine-cytokine receptor interaction|Endocytosis", "I-kappaB kinase/NF-kappaB signaling",
"NF-kappa B signaling pathway", "NF-kappaB import into nucleus",
"T cell chemotaxis"), PosCount = c(17, 18, 4, 5, 1, 2), shortgo = structure(c(7L,
7L, 18L, 18L, 18L, 21L), .Label = c("TNF", "adaptive", "alpha",
"apop", "beta", "chemokine", "cytokine", "death", "defense",
"gamma", "immune response", "infla", "interleukin-1 ", "interleukin-10 ",
"interleukin-12 ", "interleukin-18 ", "interleukin-6 ", "kappa",
"migration", "stress", "taxis", "wound"), class = "factor")), .Names = c("GO",
"PosCount", "shortgo"), class = "data.frame", row.names = c(NA,
6L))
我想做的是根据shortgo
分割数据帧,然后按照PosCount
对其GO
成员进行排序,得到以下结果(手工制作):
我被这件事困住了:
> split(tdf$GO,tdf$shortgo)
Error in split.default(tdf$GO, tdf$hsortgo) :
group length is 0 but data length > 0
我该怎么做呢?您可以在拆分之前先订购数据帧:
library(dplyr)
tdf <- tdf %>% group_by(shortgo) %>% arrange(desc(PosCount))
如果要在数据帧列表中拆分数据帧,可以使用:
ldf <- split(tdf, tdf$shortgo, drop=TRUE)
使用
data.table
,您可以使用,然后按如下方式分组:
require(data.table)
ans = setorder(setDT(tdf), shortgo, -GO)[, .(GO_list = list(GO)), by=shortgo]
我建议保留它,这样更容易对它执行计算。但如果你坚持你的最终结构,那么你可以:
ans = setattr(ans$GO_list, 'names', as.character(ans$shortgo))
ans = setDT(tdf)[order(shortgo, -GO), .(GO_list = list(GO)), by=shortgo]
如果您不希望通过引用对原始数据重新排序,可以执行以下操作:
ans = setattr(ans$GO_list, 'names', as.character(ans$shortgo))
ans = setDT(tdf)[order(shortgo, -GO), .(GO_list = list(GO)), by=shortgo]
或者,如果OP希望继续使用
base
函数:split(tdf$GO[order(tdf$shortgo,-tdf$PosCount)],tdf$shortgo,drop=TRUE)
(您不需要dplyr
来排序数据)。@Henrik Thanx!我会把它包括在答案中。
require(data.table)
ans = setorder(setDT(tdf), shortgo, -GO)[, .(GO_list = list(GO)), by=shortgo]
ans = setattr(ans$GO_list, 'names', as.character(ans$shortgo))
ans = setDT(tdf)[order(shortgo, -GO), .(GO_list = list(GO)), by=shortgo]