【问题标题】:data.frame compact versiondata.frame 精简版
【发布时间】:2012-11-30 02:02:09
【问题描述】:

数据框:

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

数据是呈现出来的。问题:我想从重复的列中创建一行。示例:

200.01  117:10520 155:24 265:47  266:37 281:568 282:246 227137.56097561

【问题讨论】:

  • 你想让它们都出现在一个列中吗?或在许多列中?听起来您可能想要一个列表,其中每个元素都可以是任意长度
  • 我希望它像示例中一样。所以基本上这个例子是 1 行,在算法之后它就像 4 行:200.01 200.31 200.56 200.66。我会创建一个新框架
  • 我认为@Justin 的问题是“117:10520 ... 282:246”应该是一栏还是六栏。如果需要单列,这在我看来就像是一个非常简单的 aggregate() 应用程序。
  • @mrdwab 正确。特别是如果重复条目的数量可能有很大差异,那么使用命名列表而不是多列“稀疏”data.frame 会更好。
  • 应该是一栏。是的。你能提出一个解决方案吗?

标签: r bioinformatics bioconductor


【解决方案1】:

正如 cmets 中提到的,这是一个非常简单的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")

聚合的两个选项。在第一个中,V2list。在第二个选项中,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 在 cmets 中提到的那样,根据您要执行的操作,列表可能更有用。

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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2012-12-12
    • 2011-01-06
    相关资源
    最近更新 更多