正如评论所说,这是一个非常简单的aggregate
问题:
您的数据:
的聚集
dat <- read.table(header = FALSE, stringsAsFactors=FALSE, text = "
200.01 117:10520 227137.56097561
200.01 155:24 227137.56097561
200.01 265:47 227137.56097561
200.01 266:37 227137.56097561
200.01 281:568 227137.56097561
200.01 282:246 227137.56097561
200.31 190:3374 227360
200.56 110:1261 227545.365853659
200.56 186:571 227545.365853659
200.66 114:969 227619.512195122
200.66 118:3886 227619.512195122")
两个选项。在第一个中,V2
是list
。在第二个选项中,V2
是一个字符串。
aggregate(V2 ~ V1 + V3, dat, c)
# V1 V3 V2
# 1 200.01 227137.6 117:10520, 155:24, 265:47, 266:37, 281:568, 282:246
# 2 200.31 227360.0 190:3374
# 3 200.56 227545.4 110:1261, 186:571
# 4 200.66 227619.5 114:969, 118:3886
aggregate(V2 ~ V1 + V3, dat, paste, collapse=" ")
# V1 V3 V2
# 1 200.01 227137.6 117:10520 155:24 265:47 266:37 281:568 282:246
# 2 200.31 227360.0 190:3374
# 3 200.56 227545.4 110:1261 186:571
# 4 200.66 227619.5 114:969 118:3886
参见:R Grouping functions: sapply vs. lapply vs. apply. vs. tapply vs. by vs. aggregate
如果需要多列,你可能仍然希望聚合,然后分裂列好以后使用自定义功能。一个示例功能是@RicardoSaporta共享的tableFlatten
,这将创建与最长列表项目一样多的列。但是,正如@Justin在评论中提到的,根据你想要做什么,列表可能更有用。
dat2 <- aggregate(V2 ~ V1 + V3, dat, c)
(dat2 <- tableFlatten(dat2))
# V1 V3 V2.01 V2.02 V2.03 V2.04 V2.05 V2.06
# 1 200.01 227137.6 117:10520 155:24 265:47 266:37 281:568 282:246
# 2 200.31 227360.0 190:3374
# 3 200.56 227545.4 110:1261 186:571
# 4 200.66 227619.5 114:969 118:3886
你想让它们全部出现在一列吗?或在许多列?这听起来像你可能会想要一个列表,其中每个元素可以是任何长度 – Justin
我希望它在例子中。所以基本上这个例子会是1行,在算法之后它会像4行:200.01 200.31 200.56 200.66。我会创建一个新框架 – alap
我认为@贾斯汀的问题是“应该117:10520 ... 282:246”是一列或六列。如果需要单个列,这对我来说就像是一个非常简单的'aggregate()'应用程序。 – A5C1D2H2I1M1N2O1R2T1