0

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

在我看来,这种格式的输出在组合方面不如“按”列表清晰。

任何帮助将不胜感激。谢谢。

4

2 回答 2

0

tapply您可以通过使用, 而不是 来避免这种情况by。实际上,tapplyby. 以下结果只需要一个cbindand as.data.frame,但您可以看到重点。

do.call(rbind, with(data, {
    tapply(as.character(col1), class, function(x) c(combn(x, 2)))
}))
#   [,1] [,2]
# a "m1" "m2"
# b "m1" "m2"
# c "m1" "m3"

对于相同的结果,您的by呼叫可以稍作更改。

> do.call(rbind, lapply(by(data$col1, data$class, combn, 2), as.character))
#   [,1] [,2]
# a "m1" "m2"
# b "m1" "m2"
# c "m1" "m3"
于 2014-09-18T22:55:30.363 回答
0

“聚合”输出似乎是您想要的:

aggregate(col1~class,data,function(x) t(combn(x, 2)))
  class col1.1 col1.2
1     a     m1     m2
2     b     m1     m2
3     c     m1     m3
于 2014-09-19T01:34:31.623 回答