在给定条件下转置/重塑列中的行

Posted

技术标签:

【中文标题】在给定条件下转置/重塑列中的行【英文标题】:Transpose/reshape rows in columns with given conditions 【发布时间】:2011-11-24 17:34:26 【问题描述】:

我有以下数据:

request   user   group
1         1      1
4         1      1
7         1      1
5         1      2
8         1      2
1         2      3
4         2      3
7         2      3
9         2      4

我想提取请求序列并将它们转换为列。

结果应该是这样的:

user   group   request1   request2   request3
1      1       1          4          7
1      2       5          8          NA
2      3       1          4          7
2      4       9          NA         NA

我尝试使用 ddply (plyr) 执行此操作,但没有找到可行的解决方案。

提前致谢!

【问题讨论】:

【参考方案1】:
library(reshape)

# Make some fake data
dat <- data.frame(user = c(1,1,1,2,2,3), group = c(1,1,1,1,1,2), request = c(1,4,7,5,8,1))
# Add in an ordered id
newdat <- ddply(dat, .(user, group), transform, idx = paste("request", 1:length(request), sep = ""))
# Use cast to get what we want
cast(newdat, user + group ~ idx, value = .(request))

可能有更好的方法来获取我所说的 idx,它本质上就是列标题。在不创建 newdat 数据集的情况下可能可以做到这一点,但这是我的想法。

【讨论】:

好的,这确实很好用!非常感谢!一个问题仍然存在:在我的原始数据中,每个用户和组最多有 120 个请求。 Cast 似乎改变了 idx 变量的顺序,如 request1 request2 request3 request4 request5 request6 request10 request11 request7 等。如何处理? 找到答案here:idx = paste("request", 1:length(request), sep = ""),而不是idx = sprintf("request_%03d", 1:length(request)),效果很好!【参考方案2】:

aggregate 让你非常接近:

dat <- data.frame(
    user = c(1,1,1,2,2,3,3,3,4), 
    group = c(1,1,1,1,1,2,2,2,2), 
    request = c(1,4,7,5,8,1,4,7,9)
)

aggregate(request~group + user, dat, FUN=c)

  group user request
1     1    1 1, 4, 7
2     1    2    5, 8
3     2    3 1, 4, 7
4     2    4       9

【讨论】:

我在这里遇到错误:Error in get(as.character(FUN), mode = "function", envir = envir) : object 'FUN' of mode 'function' was not found

以上是关于在给定条件下转置/重塑列中的行的主要内容,如果未能解决你的问题,请参考以下文章

根据“如果单元格中的字符串”条件删除熊猫列中的行

如何使用熊猫对与给定条件匹配的列中的值求和?

如何根据pyspark中的行和列条件过滤多行

跨数据库表中的行验证给定条件

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入

将行转置为具有条件的列[重复]