Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何dcast';变量';是否在data.table中指定一个单独的列?_R_Casting_Data.table_Subset_Reshape2 - Fatal编程技术网

R:如何dcast';变量';是否在data.table中指定一个单独的列?

R:如何dcast';变量';是否在data.table中指定一个单独的列?,r,casting,data.table,subset,reshape2,R,Casting,Data.table,Subset,Reshape2,我试图转换的数据表中有一个大数据集。原始数据集是一个交叉表,列名称中包含1到2个级别的信息。因此,我认为我需要将所有内容都分解,提取相关信息,然后将各个列重新转换回来 这就是我遇到的路障 下面是一个简化的模拟数据,显示了我正在尝试做的事情: library( data.table ) library( reshape2 ) library( stringr ) set.seed(1) DT <- data.table( ID1 = rep( c(1:3),2 ), ID2 = rep(

我试图转换的
数据表中有一个大数据集。原始数据集是一个交叉表,列名称中包含1到2个级别的信息。因此,我认为我需要将所有内容都分解,提取相关信息,然后将各个列重新转换回来

这就是我遇到的路障

下面是一个简化的模拟数据,显示了我正在尝试做的事情:

library( data.table )
library( reshape2 )
library( stringr )

set.seed(1)
DT <- data.table( ID1 = rep( c(1:3),2 ), ID2 = rep( c(1:2),3 ), 
                  X.Measure1 = rnorm(6),  X.Measure2 = rnorm(6),
                  Y.Measure1 = rnorm(6),  Y.Measure2 = rnorm(6)
                  )

Long_DT <- melt( DT, id = c( "ID1", "ID2" ) )
Long_DT[ , n := substr( Long_DT$variable, 10, 10 ) ]

Long_DT[ str_detect( Long_DT$variable, "Y.Measure." ), variable := "Y.Measure"  ]
从:

   ID1 ID2 X.Measure1 X.Measure2  Y.Measure1  Y.Measure2
1:   1   1 -0.6264538  0.4874291 -0.62124058  0.82122120
2:   2   2  0.1836433  0.7383247 -2.21469989  0.59390132
3:   3   1 -0.8356286  0.5757814  1.12493092  0.91897737
4:   1   2  1.5952808 -0.3053884 -0.04493361  0.78213630
5:   2   1  0.3295078  1.5117812 -0.01619026  0.07456498
6:   3   2 -0.8204684  0.3898432  0.94383621 -1.98935170
执行2个中间步骤:(i)将整数“1”和“2”提取到新列“n”中;和(ii)将“变量”重命名为“Y.Measure”(如下左图所示)

最终形式是通过
铸造
右侧所示的绿色图形来获得的:

示例代码:

library( data.table )
library( reshape2 )
library( stringr )

set.seed(1)
DT <- data.table( ID1 = rep( c(1:3),2 ), ID2 = rep( c(1:2),3 ), 
                  X.Measure1 = rnorm(6),  X.Measure2 = rnorm(6),
                  Y.Measure1 = rnorm(6),  Y.Measure2 = rnorm(6)
                  )

Long_DT <- melt( DT, id = c( "ID1", "ID2" ) )
Long_DT[ , n := substr( Long_DT$variable, 10, 10 ) ]

Long_DT[ str_detect( Long_DT$variable, "Y.Measure." ), variable := "Y.Measure"  ]
我试着用谷歌搜索解决方案,但没有用。我想知道我的
dcast
函数是否错误,或者我的方法是否一开始就错了(也就是说,有一种更容易实现我想要的方法)

任何帮助都将不胜感激!谢谢你的阅读


更新:

library( data.table )
library( reshape2 )
library( stringr )

set.seed(1)
DT <- data.table( ID1 = rep( c(1:3),2 ), ID2 = rep( c(1:2),3 ), 
                  X.Measure1 = rnorm(6),  X.Measure2 = rnorm(6),
                  Y.Measure1 = rnorm(6),  Y.Measure2 = rnorm(6)
                  )

Long_DT <- melt( DT, id = c( "ID1", "ID2" ) )
Long_DT[ , n := substr( Long_DT$variable, 10, 10 ) ]

Long_DT[ str_detect( Long_DT$variable, "Y.Measure." ), variable := "Y.Measure"  ]
我在上面的
dcast
函数中发现错误-LHS上应该有“n”:

dcast.data.table ( Long_DT, ID1+ID2+n ~ variable, subset = .(variable=="Y.Measure") )
结果将是:

> dcast.data.table ( Long_DT, ID1+ID2+n ~ variable, subset = .(variable=="Y.Measure") )
    ID1 ID2 n   Y.Measure
 1:   1   1 1 -0.62124058
 2:   1   1 2  0.82122120
 3:   1   2 1 -0.04493361
 4:   1   2 2  0.78213630
 5:   2   1 1 -0.01619026
 6:   2   1 2  0.07456498
 7:   2   2 1 -2.21469989
 8:   2   2 2  0.59390132
 9:   3   1 1  1.12493092
10:   3   1 2  0.91897737
11:   3   2 1  0.94383621
12:   3   2 2 -1.98935170
> 

不幸的是,XMeasure1和XMeasure2也随
子集一起消失,因此这无助于我的整体原因。

下面是我用akrun建议的
dcast
代码修改的代码:

library( data.table )
library( reshape2 )
library( stringr )

set.seed(1)
DT <- data.table( ID1 = rep( c(1:3),2 ), ID2 = rep( c(1:2),3 ), 
                  X.Measure1 = rnorm(6),  X.Measure2 = rnorm(6),
                  Y.Measure1 = rnorm(6),  Y.Measure2 = rnorm(6)
                  )

Long_DT <- melt( DT, id = c( "ID1", "ID2" ) )
Long_DT[ , n := substr( Long_DT$variable, 10, 10 ) ]

Long_DT[ str_detect( Long_DT$variable, "Y.Measure." ), variable := "Y.Measure"  ]
dcast.data.table(Long_DT[, N:=1:.N, variable], ID1+ID2+N~variable, subset = (variable=="Y.Measure") )

我不确定这是否是您所期望的,但我刚刚将一个新功能推到了
melt.data.table
,该功能允许现在熔入多列

您可以通过以下方式安装开发版本。然后你可以做:

require(data.table) ## v1.9.5
melt(DT, id=1:2, measure=list(3:4, 5:6), 
       value.name = c("X.measure", "Y.measure"))
默认情况下,
变量
列填充数字。如果不需要,只需相应地更改变量列的级别


HTH

Try
dcast.data.table(Long_DT[,N:=1.N,variable],ID1+ID2+N~ variable,subset=(variable==“Y.Measure”)
如果您需要excel图形中的结果,为什么不使用subset而不是
dcast
Hi@akrun,我尝试了您的代码,但结果似乎有误。为了响应您对子集的建议,
dcast
是一个多步骤过程的一部分,用于重新格式化数据,以便导入到另一个分析软件中。您可以看到,原始数据集是一个交叉表,列名称中包含1到2个级别的信息。因此,我认为我需要将所有内容都分解,提取相关信息,然后将各个列重新转换回来。我想我也应该提到我对数据操作缺乏经验,所以我愿意接受建议。我的意思是在
melt
步骤之后。您应该指定错误的部分。我正在查看您的excel图表。
dcast
结果似乎与中的相同。我尝试了您的
dcast
来代替我原来的dcast,将结果放在下面作为答案。TRy
dcast.data.table(Long_DT[,N:=1.N,variable],ID1+ID2+N~ variable,subset=(variable=“Y.Measure”))[order(N)]
@akrun,无论排序如何,“N”列都没有显示正确的值(请参阅我的原始帖子)。这是另一个分组。您可以创建一个新的
N
谢谢,@Arun,您的新功能非常及时!我正在阅读哈德利·威克姆(Hadley Wickham)的优秀文章《整理数据》(Tidy Data),我认为我整理数据集的方法一开始可能是错误的。直到今天,人们才意识到数据清理可能如此复杂。我怀疑你的新功能可能就是解决方案——让我来处理它,并向你汇报=)嗨@Arun,我从Github下载了最新的1.9.5 data.table包,并运行了你新的
melt
函数。恐怕我收到了以下错误消息:
melt.data.table(DT,id=1:2,measure=list(3:4,5:6),value.name=c(“X.measure”,参数'value.name'必须是长度为1的字符向量。
。真的无法找出哪里出了问题。我正在运行R3.1.2(64位版本)在Windows 8.1上。@NearchProg,你确定你正在运行1.9.5吗?你的
sessionInfo()
输出告诉你什么?Arun,我确定它是1.9.5。为了确保该包是Github的最新包,我删除了旧包并再次下载。sessionInfo()说:
>sessionInfo()R版本3.1.2(2014-10-31)平台:x86_64-w64-mingw32/x64(64位)附加基本包:[1]统计图形grDevices utils数据集方法基础其他附加包:[1]数据。表_1.9.5 devtools_1.7.0 stringr_0.6.2重塑2_1.4.1通过命名空间加载(未附加):[1]比特操作系统1.0-6时钟2.3-45 httr 0.6.1 plyr 1.8.1 Rcpp 0.11.3[6]RCurl_1.95-4.5 tools_3.1.2>
我理解,@Arun,也许当更多用户使用新功能时,一种模式可能会出现。与此同时,我使用了一种不同的方法来整理我的数据-将交叉表数据集拆分为两个不同的DTs,分别进行必要的转换,然后使用X[Y]连接DTs。这完全避免了最初的“dcast-a-subset-issue”问题。无论如何,非常感谢您提供此“多色熔融”解决方案。