基于分类变量

时间:2017-03-29 12:07:21

标签: r pivot-table categorical-data

我目前正在R中进行一些分析,似乎无法找到解决以下问题的有效方法:

我的原始数据是一个包含3列的表:"用户ID","年"和"阻止"。 阻止列可以具有值“北”,“东”,“南”,“西”,“西”,“西”等。或者'其他'。

Raw data

我现在要创建的是某种数据透视表(不确定这是否是正确的术语)。对于user_id和year的每个组合,此表应包含一行,后跟5个包含虚拟变量的新列,该虚拟变量引用该客户是否在当年的相应块中。类似于以下示例:

How the result should look like

我一直试图通过在R中使用reshape包来解决问题,但似乎很难处理分类变量" block"。 任何提示/帮助非常感谢!

提前致谢

2 个答案:

答案 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的相同组合输出多个虚拟标志。