我喜欢reshape2套餐,因为它让生活如此轻松.通常,Hadley在之前的软件包中进行了改进,从而实现了简化,运行速度更快的代码.我想我给tidyr一抡,并从我读我认为gather
是非常相似melt
的reshape2.但在阅读完文档后,我无法gather
完成相同的任务melt
.
数据视图
这是一个数据视图(dput
帖子末尾的实际数据):
teacher yr1.baseline pd yr1.lesson1 yr1.lesson2 yr2.lesson1 yr2.lesson2 yr2.lesson3
1 3 1/13/09 2/5/09 3/6/09 4/27/09 10/7/09 11/18/09 3/4/10
2 7 1/15/09 2/5/09 3/3/09 5/5/09 10/16/09 11/18/09 3/4/10
3 8 1/27/09 2/5/09 3/3/09 4/27/09 10/7/09 11/18/09 3/5/10
Run Code Online (Sandbox Code Playgroud)
码
这是melt
时尚的代码,我的尝试gather
.我gather
怎么能做同样的事情melt
?
library(reshape2); library(dplyr); library(tidyr)
dat %>%
melt(id=c("teacher", "pd"), value.name="date")
dat %>%
gather(key=c(teacher, pd), value=date, -c(teacher, pd))
Run Code Online (Sandbox Code Playgroud)
期望的输出 …
我有以下虚拟数据:
library(dplyr)
library(tidyr)
library(reshape2)
dt <- expand.grid(Year = 1990:2014, Product=LETTERS[1:8], Country = paste0(LETTERS, "I")) %>% select(Product, Country, Year)
dt$value <- rnorm(nrow(dt))
Run Code Online (Sandbox Code Playgroud)
我选择了两个产品国家组合
sdt <- dt %>% filter((Product == "A" & Country == "AI") | (Product == "B" & Country =="EI"))
Run Code Online (Sandbox Code Playgroud)
我希望每个组合并排看到这些值.我可以这样做dcast
:
sdt %>% dcast(Year ~ Product + Country)
Run Code Online (Sandbox Code Playgroud)
是否有可能spread
从包tidyr做到这一点?
我正在使用melt
并遇到以下警告消息:
attributes are not identical across measure variables; they will be dropped
环顾四周后人们提到它是因为变量是不同的类; 但是,我的数据集不是这种情况.
这是数据集:
test <- structure(list(park = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), .Label = c("miss", "piro", "sacn", "slbe"), class = "factor"),
a1.one = structure(c(3L, 1L, 3L, 3L, 3L, 3L, 1L, 3L, 3L,
3L), .Label = c("agriculture", "beaver", "development", "flooding",
"forest_pathogen", "harvest_00_20", "harvest_30_60", "harvest_70_90",
"none"), class = "factor"), a2.one = structure(c(6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), .Label = …
Run Code Online (Sandbox Code Playgroud) 我试图理解为什么开发已经转变reshape
为reshape2
包装.它们似乎在功能上是相同的,但是,reshape2
由于服务器上运行的旧版本的R ,我无法升级到当前.我担心一个主要错误的可能性会将开发转移到一个全新的包而不是简单地继续开发reshape
.有谁知道reshape
包装中是否存在重大缺陷?
我有一个调查文件,其中行是观察和列问题.
以下是一些假数据:
People,Food,Music,People
P1,Very Bad,Bad,Good
P2,Good,Good,Very Bad
P3,Good,Bad,Good
P4,Good,Very Bad,Very Good
P5,Bad,Good,Very Good
P6,Bad,Good,Very Good
Run Code Online (Sandbox Code Playgroud)
我的目标是创造这种情节ggplot2
.
这是我的假数据:
raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
Run Code Online (Sandbox Code Playgroud)
但是,如果我选择Y作为计数,那么我将面临一个关于选择X和Group值的问题......我不知道我是否能够成功而不使用reshape2
...我也厌倦了使用具有融化功能的重塑.但我不明白如何使用它...
我有一个宽格式的数据帧,在不同的日期范围内重复测量.在我的例子中,有三个不同的时期,都有相应的值.例如,第一测量(Value1
)是在测量期间从DateRange1Start
到DateRange1End
:
ID DateRange1Start DateRange1End Value1 DateRange2Start DateRange2End Value2 DateRange3Start DateRange3End Value3
1 1/1/90 3/1/90 4.4 4/5/91 6/7/91 6.2 5/5/95 6/6/96 3.3
Run Code Online (Sandbox Code Playgroud)
我希望将数据重新整形为长格式,以便将DateRangeXStart和DateRangeXEnd列分组.因此,原始表中的1行在新表中变为3行:
ID DateRangeStart DateRangeEnd Value
1 1/1/90 3/1/90 4.4
1 4/5/91 6/7/91 6.2
1 5/5/95 6/6/96 3.3
Run Code Online (Sandbox Code Playgroud)
我知道必须有一种方法可以用reshape2
/ melt
/ recast
/ 来做到这一点tidyr
,但我似乎无法弄清楚如何以这种特殊方式将多组度量变量映射到单个值列集.
我正在使用ggplot2对两种不同物种进行箱线图比较,如下面的第三列所示:
> library(reshape2)
> library(ggplot2)
> melt.data = melt(actb.raw.data)
> head(actb.raw.data)
region expression species
1 CG -0.17686667 human
2 CG -0.06506667 human
3 DG 1.04590000 human
4 CA1 1.94093333 human
5 CA2 1.55023333 human
6 CA3 1.75800000 human
> head(melt.data)
region species variable value
1 CG human expression -0.17686667
2 CG human expression -0.06506667
3 DG human expression 1.04590000
4 CA1 human expression 1.94093333
5 CA2 human expression 1.55023333
6 CA3 human expression 1.75800000
Run Code Online (Sandbox Code Playgroud)
但是,当我运行以下代码时:
ggplot(combined.data, aes(x = region, y …
Run Code Online (Sandbox Code Playgroud) 当我在reshape2包中的dcast函数中使用min或max时,我收到以下警告.它告诉我什么?我找不到任何解释警告信息的东西,我有点困惑,为什么我在使用max时得到它而不是当我使用mean或其他聚合函数时.
警告消息:
在.fun(.value [0],...)中:min没有非缺失参数; 返回Inf
这是一个可重复的例子:
data(iris)
library(reshape2)
molten.iris <- melt(iris,id.var="Species")
summary(molten.iris)
str(molten.iris)
#------------------------------------------------------------
# Both return warning:
dcast(data=molten.iris,Species~variable,value.var="value",fun.aggregate=min)
dcast(data=molten.iris,Species~variable,value.var="value",fun.aggregate=max)
# Length looks fine though
dcast(data=molten.iris,Species~variable,value.var="value",fun.aggregate=length)
#------------------------------------------------------------
# No warning messages here:
aggregate(value ~ Species + variable, FUN=min, data=molten.iris)
aggregate(value ~ Species + variable, FUN=max, data=molten.iris)
#------------------------------------------------------------
# Or here:
library(plyr)
ddply(molten.iris,c("Species","variable"),function(df){
data.frame(
"min"=min(df$value),
"max"=max(df$value)
)
})
#------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud) 在帮助文件中dcast.data.table
,有一条说明已实现新功能的说明:"dcast.data.table允许value.var列为类型列表"
我认为这意味着一个列表中可以有多个值变量,即采用以下格式:
dcast.data.table(dt, x1~x2, value.var=list('var1','var2','var3'))
Run Code Online (Sandbox Code Playgroud)
但是我们得到一个错误: 'value.var' must be a character vector of length 1.
是否有这样的功能,如果没有,那么其他单线替代品会是什么?
编辑:回复以下评论
在某些情况下,您需要将多个变量视为value.var
.想象一下,例如x2由3个不同的周组成,你有2个值变量,如盐和糖的消耗,你想在不同的周内投射这些变量.当然,你可以将2个值变量"融化"成一个列,但为什么要使用两个函数做什么,当你可以在一个函数中这样reshape
做时呢?
(注意:我也注意到reshape
不能将多个变量视为时间变量dcast
.)
所以我的观点是,我不明白为什么这些函数不允许灵活地在其中包含多个变量,value.var
或者time.var
就像我们允许的多个变量一样id.var
.
我需要将我的宽表重新整形为长格式,但为每条记录保留多个字段,例如:
dw <- read.table(header=T, text='
sbj f1.avg f1.sd f2.avg f2.sd blabla
A 10 6 50 10 bA
B 12 5 70 11 bB
C 20 7 20 8 bC
D 22 8 22 9 bD
')
# Now I want to melt this table, keeping both AVG and SD as separate fields for each measurement, to get something like this:
# sbj var avg sd blabla
# A f1 10 6 bA
# A f2 50 10 bA
# B …
Run Code Online (Sandbox Code Playgroud)