更新/捂脸
您数据集中的“NA”可能不是NA 值,而是北美的缩写“NA”或类似的东西。
如果您在读入数据时使用了na.strings,那么使用reshape 应该没有问题,正如我最初指出的那样:
mydf <- read.table(header = TRUE, na.strings = "",
text = 'ID Geo Channel Brand Neworstream RevQ112 RevQ212 RevQ312
1 NA On-line 1 New 5 0 1
1 NA On-line 1 Stream 5 0 1
3 EU Tele 2 Stream 5 1 0')
reshape(mydf, direction = "wide",
idvar = c("ID", "Geo", "Brand", "Neworstream"),
timevar = "Channel")
(不过,为了便于阅读和减少混淆,我可能会建议您更改缩写!)
原始答案(因为那里还有一些关于 reshape 的有趣之处)
应该这样做:
reshape(mydf, direction = "wide",
idvar = c("ID", "Geo", "Brand", "Neworstream"),
timevar = "Channel")
# ID Geo Brand Neworstream RevQ112.On-line RevQ212.On-line RevQ312.On-line
# 1 1 <NA> 1 New 5 0 1
# 3 3 EU 2 Stream NA NA NA
# RevQ112.Tele RevQ212.Tele RevQ312.Tele
# 1 NA NA NA
# 3 5 1 0
更新(试图挽救一点答案)
正如@Arun 指出的那样,上述内容并不完全正确。这里的罪魁祸首是interaction(),当指定了多个ID变量时,reshape()使用它来创建一个新的临时ID变量。
这是来自reshape() 的行以及应用于我们的“mydf”对象时的样子:
data[, tempidname] <- interaction(data[, idvar], drop = TRUE)
interaction(mydf[c(1, 2, 4, 5)], drop = TRUE)
# [1] <NA> <NA> 3.EU.2.Stream
# Levels: 3.EU.2.Stream
嗯。这似乎简化为两个 ID,NA 和 3.EU.2.Stream。
如果我们将NA 替换为"" 会发生什么?
mydf$Geo <- as.character(mydf$Geo)
mydf$Geo[is.na(mydf$Geo)] <- ""
interaction(mydf[c(1, 2, 4, 5)], drop = TRUE)
# [1] 1..1.New 1..1.Stream 3.EU.2.Stream
# Levels: 1..1.New 1..1.Stream 3.EU.2.Stream
啊啊。这样好一点。我们现在有了三个唯一的 ID...reshape() 似乎可以工作。
reshape(mydf, direction = "wide",
idvar=names(mydf)[c(1, 2, 4, 5)],
timevar="Channel")
# ID Geo Brand Neworstream RevQ112.On-line RevQ212.On-line
# 1 1 1 New 5 0
# 2 1 1 Stream 5 0
# 3 3 EU 2 Stream NA NA
# RevQ312.On-line RevQ112.Tele RevQ212.Tele RevQ312.Tele
# 1 1 NA NA NA
# 2 1 NA NA NA
# 3 NA 5 1 0