【问题标题】:convert to wide format and set 0 if value does not exists如果值不存在,则转换为宽格式并设置 0
【发布时间】:2018-05-10 10:34:06
【问题描述】:

我有以下数据集:

dataset1 <- data.frame(
        bnames = c("T1", "T1", "T2", "T3", "T3"),
        events = c("I", "O", "I", "I", "O"),
        freq = c(1,2,3,4,5))

我想将此数据集转换为宽格式,我的方法(使用reshape 包):

dataset2 <- melt(dataset1, id.vars = c("bnames", "events"))
dataset2 <- dataset2[c("bnames", "events", "value")]
names(dataset2) <- c("bnames", "events", "freq")

dataset2的内容:

  bnames events freq
1     T1      I    1
2     T1      O    2
3     T2      I    3
4     T3      I    4
5     T3      O    5

但是bnames 列下应该总是有两行同名。一行带有I,另一行带有Oevents 列下。如果原始数据集(dataset1)中不存在相应的值,则freq 下的值应始终为 0。所以在这种情况下我想要的结果应该是:

  bnames events freq
1     T1      I    1
2     T1      O    2
3     T2      I    3
4     T2      O    0
5     T3      I    4
6     T3      O    5

如何做到这一点?谢谢

【问题讨论】:

  • dataset1dataset2 有什么区别?
  • @mtoto dataset1是原始数据,dataset2是整理后的最终数据。
  • 它们在我看来是一样的

标签: r reshape reshape2 melt


【解决方案1】:

这是基础 R 中的一种方式:

left_hand <- expand.grid(
        bnames = unique(dataset1$bnames), 
        events = c("I", "O"), 
        stringsAsFactors = FALSE
      )

dataset2 <- merge(left_hand, dataset2, all.x = TRUE)
dataset2[is.na(dataset2)] <- 0

或者,tidyr 包中有一个单行:

tidyr::complete(dataset2, bnames, events, fill = list(freq = 0))

【讨论】:

  • tidyr 示例中,应该是dataset1 而不是dataset2? (tidyr::complete(dataset1, bnames, events, fill = list(freq = 0)))
  • 嗯,仔细看,dataset1dataset2不一样吗?
  • 是的,你是对的 - 抱歉 - 在第一次阅读问题时,这对我来说并不明显。不错 tidyr::complete 例子顺便说一句 +1
【解决方案2】:

这是一个data.table 解决方案。生成 bnames 和事件的所有可能排列,将此集合与原始数据集左连接,如果可用则返回频率,否则设置为 0。

library(data.table)
setDT(dataset1)[CJ(bnames=bnames, events=events, unique=TRUE), 
    .(freq=ifelse(is.na(freq), 0, freq)), 
    by=.EACHI, 
    on=.(bnames, events)]

#   bnames events freq
#1:     T1      I    1
#2:     T1      O    2
#3:     T2      I    3
#4:     T2      O    0
#5:     T3      I    4
#6:     T3      O    5

【讨论】:

    猜你喜欢
    • 2013-09-10
    • 1970-01-01
    • 2022-01-06
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多