r - 如何使 data.frame 中的组等长?

标签 r dataframe

我有这个 data.frame:

df <- data.frame(id=c('A','A','B','B','B','C'), amount=c(45,66,99,34,71,22))

id | amount 
-----------
A  |   45   
A  |   66   
B  |   99
B  |   34 
B  |   71
C  |   22

我需要扩展以便每个 by data.frame 中的组长度相等(用零填充),如下所示:
id | amount 
-----------
A  |   45   
A  |   66  
A  |   0     <- added 
B  |   99
B  |   34 
B  |   71
C  |   22
C  |   0     <- added 
C  |   0     <- added 

这样做的最有效方法是什么?

注意

对我的实际 100 万行 data.frame 提供的一些解决方案进行基准测试,我得到:
             plyr   | data.table  |  unstack
          -----------------------------------
Elapsed:   139.87s  |    0.09s    |   2.00s

最佳答案

使用 data.table 的一种方式

df <- structure(list(V1 = structure(c(1L, 1L, 2L, 2L, 2L, 3L), 
          .Label = c("A  ", "B  ", "C  "), class = "factor"), 
          V2 = c(45, 66, 99, 34, 71, 22)), 
          .Names = c("V1", "V2"), 
          class = "data.frame", row.names = c(NA, -6L))

require(data.table)
dt <- data.table(df, key="V1")

# get maximum index
idx <- max(dt[, .N, by=V1]$N)

# get final result
dt[, list(V2 = c(V2, rep(0, idx-length(V2)))), by=V1]

#     V1 V2
# 1: A   45
# 2: A   66
# 3: A    0
# 4: B   99
# 5: B   34
# 6: B   71
# 7: C   22
# 8: C    0
# 9: C    0

关于r - 如何使 data.frame 中的组等长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14621795/

相关文章:

r - 使用 IFELSE 从多个概率生成数据

r - 将列表对象的列表转换为 R 中的数据框

r - 如何为列中每组相同值分配唯一的 ID 号

python - 将 python 数据帧转换为 json 格式

python - 列重命名为 : switching between numbers and letters

python - 'DataFrame' 对象没有属性 'sort'

R - 在 dplyr 中使用 group_by() 和 mutate() 来应用返回组长度向量的函数

R - 从自己的函数将变量保存到数据帧

python - 将多个 pandas 数据帧附加到单个 csv,但仅在第一个附加上包含标题

python - 使用一对多字典替换或映射 pandas 数据框列中的值