【发布时间】:2014-09-18 22:44:14
【问题描述】:
data=data.frame(col1=c('m1','m1','m1','m2','m2','m2','m3','m3'),class=c( 'a','b','c','a','b','c', 'a', 'b'))我有一个有 2 列的 data.frame,第一列是模型,第二列模型属性列表。我需要根据它们共享的属性显示模型的组合。我使用'by'函数得到的组合列表如下:
data= data.frame(col1=c('m1','m1','m1','m2','m2','m3'), class=c('a','b','c','a','b','c'))
data.ls=by(data$col1, data$class,function(x) t(combn(x, 2)))
输出正是我所需要的,但我需要它以 data.frame 格式而不是列表,并且出现在每个列表顶部的“类”的名称应列在第三列中:
# data$class: a
# [,1] [,2]
# [1,] m1 m2
# [2,] m1 m3
# [3,] m2 m3
# Levels: m1 m2 m3
所以,我尝试了这个:
as.data.frame(do.call("rbind",data.ls))
但输出仅显示“col1”的组合(使用 id 值而不是名称)而不是“class”属性,该属性位于“by”输出中每个列表的顶部。 do.call 的输出如下所示:
# V1 V2
# 1 1 2
# 2 1 2
# 3 1 3
也试过这个:
do.call("rbind.data.frame",data.ls)
得到这个错误:NextMethod() 中的错误:无效值
决赛桌应该是这样的:
data.final= data.frame(col1=c('m1','m1','m1'), col2=c('m2', 'm2', 'm3'), class=c('a','b','c'))
@Richard Scrivens 提出以下建议:
newDF <- data.frame(do.call(rbind, lapply(data.ls, as.character)), names(data.ls), row.names = NULL)
输出是:
X1 X2 X3 X4 X5 X6 names.data.ls.
1 m1 m1 m2 m2 m3 m3 a
2 m1 m1 m2 m2 m3 m3 b
3 m1 m2 m1 m2 m1 m2 c
在我看来,这种格式的输出在组合方面不如“按”列表清晰。
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
as.data.frame 没用?
-
或许,您可以使用
aggregate以aggregate(col1 ~ class, data, function(x) t(combn(x, 2)))开头? -
@RichardScriven tapply 示例---- tab