【问题标题】:How to convert a 'by' [list] output into a dataframe如何将“按”[列表]输出转换为数据框
【发布时间】: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 没用?
  • 或许,您可以使用aggregateaggregate(col1 ~ class, data, function(x) t(combn(x, 2))) 开头?
  • @RichardScriven tapply 示例---- tab

标签: r list reshape2 combn


【解决方案1】:

您可以通过使用tapply 而不是by 来避免这种情况。实际上,tapplyby 的主力函数。下面的结果只需要一个cbindas.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"

【讨论】:

  • 感谢@Richard Scriven。原则上,您的解决方案适用于此示例。但是,当我为单个类获得超过 1 个组合时,我不确定如何读取输出。为了说明这一点,我将对原始示例进行一些更改。
  • @LuluPor - 尝试我的编辑,使用tapply 解决方案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 2019-11-16
    • 2019-06-26
    • 1970-01-01
    • 2020-07-15
    • 2020-07-29
    • 2021-08-21
    • 2019-09-13
    • 2020-03-04
    相关资源
    最近更新 更多