【问题标题】:reshape data and coerce missing to zero重塑数据并强制缺失为零
【发布时间】:2016-02-11 10:15:11
【问题描述】:

编辑: 原始数据集可以在这里找到:link

我有一个像这样的矩阵:

data <- matrix(c("a","1","10",
             "b","1","20",
             "c","1","30",
             "a","2","10",
             "b","2","20",
             "a","3","10",
             "c","3","20"),
             ncol=3, byrow=TRUE)

我想重塑为将缺失值强制为零的数据框:

data <- matrix(c("a","1","10",
             "b","1","20",
             "c","1","30",
             "a","2","10",
             "b","2","20",
             "c","2","0",
             "a","3","10",
             "b","3","0",
             "c","3","20"),
             ncol=3, byrow=TRUE)

如何使用 reshape 包做到这一点? 谢谢

【问题讨论】:

  • 你为什么使用matrix

标签: r casting reshape2 melt


【解决方案1】:

我们可以使用 tidyr 的complete,在稍微转换一下你的数据后:

library(tidyr)
data <- as.data.frame(data)
data$V3 <- as.numeric(as.character(data$V3))
complete(data, V1, V2, fill = list(V3 = 0))

【讨论】:

  • 在我的数据上它说:left_join_impl(x, y, by$x, by$y) 中的错误:尝试在 SET_STRING_ELT 中设置索引 0/0。在我的真实数据集中,V3 是(int)。它会以某种方式影响它吗?
  • 我担心我分享的数据有问题,但我不明白是什么。这是原始数据:link
  • 从你的数据来看,我想你想要complete(data, label, count, fill = list(unique_elements = 0)) ?
【解决方案2】:

tidyr 更好,但如果你想使用reshape,你可以

library(reshape2)

data2=dcast(data = as.data.frame(data),V1~V2)
data3=melt( data2,measure.vars=colnames(data2)[-1])
data3[is.na(data3)]="0"

【讨论】:

    【解决方案3】:

    在我看来,您正在处理诸如多元时间序列之类的事情。因此,我建议使用适当的时间序列对象。

    library(zoo)
    res=read.zoo(data.frame(data,stringsAsFactors=FALSE),
             split=1,
             index.column=2,
             FUN=as.numeric)
    coredata(res)=as.numeric(coredata(res))
    coredata(res)[is.na(res)]=0
    

    这给了

    res
    #  a  b  c 
    #1 10 20 30
    #2 10 20 0 
    #3 10 0  20
    

    【讨论】:

      【解决方案4】:

      我认为你有一个包含多个类的矩阵是错误的。

      首先我将转换为data.framedata.table,然后将所有列转换为正确的类型。类似的东西

      library(data.table) # V 1.9.6+
      # Convert to data.table
      DT <- as.data.table(data) 
      
      # Convert to correct column types
      for(j in names(DT)) set(DT, j = j, value = type.convert(DT[[j]])) 
      

      然后我们可以使用data.table::CJ 扩展行并将零分配给NA

      ## Cross join all column except the third
      DT <- DT[do.call(CJ, c(unique = TRUE, DT[, -3, with = FALSE])), on = names(DT)[-3]]
      
      ## Or if you want only to operate on these two columns you can alternatively do
      # DT <- DT[CJ(V1, V2, unique = TRUE), on = c("V1", "V2")]
      
      ## Fill with zeroes
      DT[is.na(V3), V3 := 0]
      DT
      #    V1 V2 V3
      # 1:  a  1 10
      # 2:  a  2 10
      # 3:  a  3 10
      # 4:  b  1 20
      # 5:  b  2 20
      # 6:  b  3  0
      # 7:  c  1 30
      # 8:  c  2  0
      # 9:  c  3 20
      

      【讨论】:

      • 我担心我分享的数据有问题,但我不明白是什么。这是原始数据:link
      猜你喜欢
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多