我目前正在R中进行一些分析,似乎无法找到解决以下问题的有效方法:
我的原始数据是一个包含3列的表:"用户ID","年"和"阻止"。 阻止列可以具有值“北”,“东”,“南”,“西”,“西”,“西”等。或者'其他'。
我现在要创建的是某种数据透视表(不确定这是否是正确的术语)。对于user_id和year的每个组合,此表应包含一行,后跟5个包含虚拟变量的新列,该虚拟变量引用该客户是否在当年的相应块中。类似于以下示例:
我一直试图通过在R中使用reshape包来解决问题,但似乎很难处理分类变量" block"。 任何提示/帮助非常感谢!
提前致谢
答案 0 :(得分:0)
使用data.table
,您可以尝试:
require(data.table)
dt <- as.data.table(df)
types <- c("east", "north", "south", "west")
dt[, lapply(types, function(x) sum(block==x)), keyby =.(Userid, year)]
答案 1 :(得分:0)
这是使用Base R和aggregate
的简单方法:
d <- data.frame("User id"=c(1,1,2,3,1), year=c(2015,2016,2015,2015,2015),
block=c("north","south","east","west","south"), check.names = F)
f <- function(l, vec) {
vec[l] <- 1
vec
}
vec <- setNames(rep(0, 4), levels(d$block))
> aggregate(block~`User id` + year, d, f, vec)
User id year block.east block.north block.south block.west
1 1 2015 0 1 1 0
2 2 2015 1 0 0 0
3 3 2015 0 0 0 1
4 1 2016 0 0 1 0
我添加了一个额外的数据点,表明它可以为id和year的相同组合输出多个虚拟标志。