如何解决将数据融化/铸造为形状
| 我有一个看起来像这样的表: 我需要它看起来像这样,其中net = gross-tare: 我该怎么做呢? 我首先融化数据,然后转换为列,然后为净读数创建新列。 df_m <- melt(df,id = 1:3)
df_c <- cast(df_m,... ~ variable + type)
df_c$wr_net <- df_c$wr_gross - df_c$wr_tare
df_c$wc_net <- df_c$wc_gross - df_c$wc_tare
df_c$tsa_net <- df_c$tsa_gross - df_c$tsa_tare
这使
但是现在我无法弄清楚如何融合此表以使数据框看起来像我需要的方式,即带有'type \'列的值具有'\ gross \'和\'tare \'和\'net \'。
有更容易的方法吗?我是否用融化/浇铸方法把错误的树吠叫?
您可以使用此方法复制我的数据的一小部分...
df <- structure(list(train = structure(c(1L,1L,1L),.Label = \"AC0485n\",class = \"factor\"),position = c(1L,2L,3L,3L),type = structure(c(2L,.Label = c(\"gross\",\"tare\"),wids_raw = c(24.85,146.2,26.16,135,24.7,135.1),wids_corr = c(26.15,145.43,27.44,134.43,26,134.52),tsa = c(24.1,139.2,25,133.6,24,131.1)),.Names = c(\"train\",\"position\",\"type\",\"wr\",\"wc\",\"tsa\"),class = \"data.frame\",row.names = c(NA,-6L))
解决方法
我认为您只需要使用ddply即可:
ddply(df,.(position),.fun=function(x){
newrow <- x[1,]
newrow$type <- \"net\"
newrow[4:6] <- x[x$type==\"gross\",4:6] - x[x$type==\"tare\",4:6]
return(rbind(x,newrow))
})
返回,
train position type wr wc tsa
1 AC0485n 1 tare 24.85 26.15 24.1
2 AC0485n 1 gross 146.20 145.43 139.2
3 AC0485n 1 net 121.35 119.28 115.1
4 AC0485n 2 tare 26.16 27.44 25.0
5 AC0485n 2 gross 135.00 134.43 133.6
6 AC0485n 2 net 108.84 106.99 108.6
7 AC0485n 3 tare 24.70 26.00 24.0
8 AC0485n 3 gross 135.10 134.52 131.1
9 AC0485n 3 net 110.40 108.52 107.1
编辑:
而且我认为,如果您真的想使用熔铸/浇铸,这会起作用:
dd <- melt.data.frame(df_c,id.vars=1:2)
dd$type <- factor(do.call(\"rbind\",strsplit(as.character(dd$variable),\"_\"))[,2])
dd$variable <- factor(do.call(\"rbind\",1])
, 如果您真的只想使用重塑来做到这一点,这就是我的做法:
library(reshape2)
df_m <- melt(df,id = 1:3)
df_c <- dcast(df_m,... ~ type)
df_c$net <- df_c$gross - df_c$tare
df_m2 <- melt(df_c,1:3)
names(df_m2)[4] <- \"type\"
dcast(df_m2,... ~ variable)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。