【问题标题】:Restructuring data in R [duplicate]在R中重构数据[重复]
【发布时间】:2015-02-27 11:11:09
【问题描述】:

我在重组数据时遇到问题。我有两列,我想要对这些列做的是将它们堆叠在它们的原始行下,使得第一行第一列位于第一行第二列的顶部,第二列位于第二行的顶部,第一列位于顶部第二行第二列 - 依此类推。在 R 形式中,它看起来像这样:

C1 C2
 1  2
 1  2
 1  2

我希望它看起来像这样

C3
 1
 2
 1
 2
 1
 2

【问题讨论】:

  • 搜索:[r] columns interleave

标签: r dataframe rows calculated-columns


【解决方案1】:

您可以对数据集进行转置,即。 t(df) 将列交换为行,输出将是 matrix(即具有维度属性的向量)。要去除维度并创建真正的向量,您可以使用as.vector 或简单地使用c(连接)。这可用于创建单个列data.frame

data.frame(C3 = c(t(df)))

或者使用mapply 的另一个选项(由@David Arenburg 提供)。在这里,这个想法再次将列“C1”和“C2”的元素逐个连接起来。

data.frame(C3 = c(mapply(c, df$C1, df$C2)))

要检查它是如何工作的,请尝试Map。这里,list 元素的数量将等于dfnrow

Map(`c`, df$C1, df$C2)

数据

df <- structure(list(C1 = c(1L, 1L, 1L), C2 = c(2L, 2L, 2L)), .Names = c("C1", 
"C2"), class = "data.frame", row.names = c(NA, -3L))

这里是向量化方法和*applyfamily 之间区别的说明

n <- 1e4
df <- data.frame(C1 = rep(1, n), C2 = rep(2, n))

library(microbenchmark)
microbenchmark(akrun = c(t(df)), David = c(mapply(c, df$C1, df$C2)))
# Unit: microseconds
#  expr       min         lq       mean     median         uq       max neval
# akrun   204.608   215.7795   259.9504   265.4155   275.9485   374.741   100
# David 11933.612 12245.7890 13190.8289 12399.0050 13463.8565 30267.502   100

【讨论】:

  • 你花了 15 秒才回答,那里的卓尔好...
  • @DavidArenburg 谢谢,但这类问题可能是duplicates
  • @DavidArenburg,去年他会为此得到一顶帽子......
  • 值得解释为什么这样做。 t(df) 将列换成行。对c() 的调用将其转换为向量,连接列,即原始行。
  • @dash2 感谢您的解释。我应该把这个添加到帖子中。
【解决方案2】:

我想知道这会如何执行:

matrix( data.matrix(df), ncol=1, byrow=TRUE)

但它仍然比 akrun 慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2021-03-01
    • 2010-12-04
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多