简体   繁体   English

为什么reshape2熔化返回值= NA?

[英]Why does reshape2 melt return value = NA for me?

Why does reshape2 melt return value = NA for me? 为什么reshape2 melt返回value = NA

It works for me with reshape, but not with reshape2: 它可以重塑,但不是reshape2:

Here is an example datafile: 这是一个示例数据文件:

"","station_id","year","month","day","h1","h2","h3","h4","h5","h6","h7","h8","h9","h10","h11","h12","h13","h14","h15","h16","h17","h18","h19","h20","h21","h22","h23","h24"
"1",1,2004,1,1,46,46,45,41,39,35,33,33,36,47,53,54,55,55,55,55,52,46,40,40,39,38,40,41
"2",1,2004,1,2,43,44,46,46,47,47,47,47,47,47,47,49,52,56,54,56,57,53,50,47,46,45,45,45
"3",1,2004,1,3,45,46,46,44,43,46,46,47,51,55,56,59,65,68,69,68,68,65,64,63,62,63,63,62
"4",1,2004,1,4,63,62,62,62,60,60,60,62,60,64,64,66,71,70,71,72,71,68,67,67,65,64,65,64
"5",1,2004,1,5,64,63,65,64,64,64,64,64,65,66,66,67,68,68,66,66,66,66,63,54,52,49,47,47
"6",1,2004,1,6,47,46,45,43,41,41,39,39,40,43,45,44,45,46,46,46,45,39,39,39,38,36,32,32

Let's say it is saved as /tmp/foo.csv , then: 假设它保存为/tmp/foo.csv ,然后:

Using reshape: 使用重塑:

$ R
...
Type 'q()' to quit R.

> library("reshape")
Loading required package: plyr

Attaching package: ‘reshape’

The following object(s) are masked from ‘package:plyr’:

    rename, round_any

> hlist <- NULL; for(z in 1:24) { hlist <- cbind(hlist, sprintf("h%d",z)) }
> 
> thh <- read.csv('/tmp/foo.csv')
> thm <- melt(thh,measure.vars=hlist,variable="hour")
> head(thm)
  station_id year month day hour value
1          1 2004     1   1   h1    46
2          1 2004     1   2   h1    43
3          1 2004     1   3   h1    45
4          1 2004     1   4   h1    63
5          1 2004     1   5   h1    64
6          1 2004     1   6   h1    47
> q()

Using reshape2: 使用reshape2:

$ R
...
Type 'q()' to quit R.

> library("reshape2")
> hlist <- NULL; for(z in 1:24) { hlist <- cbind(hlist, sprintf("h%d",z)) }
> 
> thh <- read.csv('/tmp/foo.csv')
> thm <- melt(thh,measure.vars=hlist,variable="hour")
> head(thm)
  station_id year month day hour value
1          1 2004     1   1   h1    NA
2          1 2004     1   2   h1    NA
3          1 2004     1   3   h1    NA
4          1 2004     1   4   h1    NA
5          1 2004     1   5   h1    NA
6          1 2004     1   6   h1    NA
> q()

You can see that using library("reshape") , the value column has numbers, but for libary("reshape2") , it has NA , for the same data. 您可以看到使用library("reshape")value列具有数字,但对于libary("reshape2") ,它具有NA ,用于相同的数据。

There are better ways to do what you are trying to do. 有更好的方法来做你想做的事情。

All of the following would work with melt() from reshape2 : 所有以下内容都适用于reshape2 melt()

# Not using hlist
melt(th, measure.vars=5:ncol(th), variable="hour")
melt(th, id.vars=1:4, variable="hour")

# Using your hlist
hlist <- NULL; for(z in 1:24) { hlist <- cbind(hlist, sprintf("h%d",z)) }
melt(th, measure.vars=as.vector(hlist), variable="hour")

# Using an alternative hlist
hlist <- paste0("h", 1:24)
melt(th, measure.vars=hlist, variable="hour")

It seems like melt() from "reshape" accepts a matrix as an input for measure.vars , but melt() from "reshape2" does not (which I find more reasonable). 这似乎是melt()从“重塑”接受一个矩阵作为输入measure.vars ,但melt()从“reshape2”没有(我觉得这更合理)。

Update: Example reproducible problem 更新:示例可重现的问题

FYI, below is a start-to-finish way that you can share this problem in a way that is convenient for other Stack Overflow users to copy and paste: 仅供参考,以下是一种从头到尾的方式,您可以通过方便其他Stack Overflow用户复制和粘贴的方式分享此问题:

# Use set.seed when you want to use random numbers 
#   but want others to have the same data as you.
set.seed(1) 

# Make up some data that mimics your actual dataset
# Does not have to be your exact dataset
th <- cbind(
  data.frame(station = rep(LETTERS[1:3], each = 3),
             year = 2004, month = rep(1:3, times = 3)), 
  setNames(data.frame(
    matrix(sample(100, 45, replace = TRUE), nrow = 9)),
           paste0("h", 1:5)))

hlist <- NULL; for(z in 1:5) { hlist <- cbind(hlist, sprintf("h%d",z)) }
# Cleanup any unnecessary stuff that your code leaves behind in the workspace
rm(z) 

Now, demonstrate your problem. 现在,展示你的问题。 You can use detach(package:package_name) instead of having to quit and restart R. 您可以使用detach(package:package_name)而不必退出并重新启动R.

library(reshape)
head(melt(th, measure.vars = hlist, variable = "hour"))
#   station year month hour value
# 1       A 2004     1   h1    27
# 2       A 2004     2   h1    38
# 3       A 2004     3   h1    58
# 4       B 2004     1   h1    91
# 5       B 2004     2   h1    21
# 6       B 2004     3   h1    90
detach(package:reshape)

library(reshape2)
head(melt(th, measure.vars = hlist, variable = "hour"))
#   station year month hour value
# 1       A 2004     1   h1  <NA>
# 2       A 2004     2   h1  <NA>
# 3       A 2004     3   h1  <NA>
# 4       B 2004     1   h1  <NA>
# 5       B 2004     2   h1  <NA>
# 6       B 2004     3   h1  <NA>
detach(package:reshape2)

Hope this helps! 希望这可以帮助!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM