【问题标题】:How to convert a long data frame to a wide data frame with duplicates/triplicates? [duplicate]如何将长数据框转换为具有重复/三次的宽数据框? [复制]
【发布时间】:2017-09-13 19:17:56
【问题描述】:

假设我有一个包含三列的长格式数据框。 x 列包含测量值,y 3 个变量的名称,z 包含 2 个级别。每个y 变量都有重复的测量值:

df <- data.frame(x=c(1:12), y=rep(0:2, 4), z=rep(letters[1:2], 6))
df$y <- as.factor(df$y)
df <- arrange(df, y, z)
df

    x y z
1   1 0 a
2   7 0 a
3   4 0 b
4  10 0 b
5   5 1 a
6  11 1 a
7   2 1 b
8   8 1 b
9   3 2 a
10  9 2 a
11  6 2 b
12 12 2 b

我怎样才能得到这样的df_wide

z  0  1  2
a  1  5  3
a  7  11 9
b  4  2  6
b  10 8  12

【问题讨论】:

  • 你能详细说明这里发生了什么吗?
  • 在 df 中,column-x 是测量值,column-y 是 3 个变量,column-z 包含 2 个水平,并且每个都有对 column-y 变量的重复测量。希望这很清楚:) 谢谢@mtoto

标签: r reshape


【解决方案1】:
do.call(cbind, lapply(split(df, df$y), function(a)
    setNames(object = data.frame(a$x,
                                 row.names = paste0(as.character(a$z), 1:NROW(a))),
             nm = a$y[1])))
#    0  1  2
#a1  1  5  3
#a2  7 11  9
#b3  4  2  6
#b4 10  8 12

【讨论】:

  • 谢谢! @d.b 实际上,我有一个 dfs 列表。这个 df 是我列表中的一个元素。如何实现列表中的 do.call(...) 代码?
【解决方案2】:

使用 data.table 包中的 dcast()rowid() 函数,这将变成“单线”:

library(data.table)
dcast(setDT(df), paste0(z, rowid(y, z)) ~ y, value.var = "x")
    z  0  1  2
1: a1  1  5  3
2: a2  7 11  9
3: b1  4  2  6
4: b2 10  8 12

【讨论】:

  • 有效!!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 2020-11-28
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
相关资源
最近更新 更多