Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 拆分数据帧并根据特定列对拆分的值进行排序_R_Dataframe - Fatal编程技术网

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]