Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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 当没有用于某些重复的列名时,重新塑造为长格式_R_Data.table_Reshape - Fatal编程技术网

R 当没有用于某些重复的列名时,重新塑造为长格式

R 当没有用于某些重复的列名时,重新塑造为长格式,r,data.table,reshape,R,Data.table,Reshape,我有一个下面的示例数据集,我正在尝试使用data.table包(请不要使用dplyr解决方案)将其重塑为长格式 请建议 一种选择是进行melt/dcast dcast(melt(setDT(test_data), measure = patterns("d\\d+"))[, c("var1", "var2") := tstrsplit(variable, "_")[-1]], id + var1 ~ var2, value.var = 'value')[order(var

我有一个下面的示例数据集,我正在尝试使用data.table包(请不要使用dplyr解决方案)将其重塑为长格式


请建议

一种选择是进行
melt/dcast

dcast(melt(setDT(test_data), measure = patterns("d\\d+"))[,
    c("var1", "var2") := tstrsplit(variable, "_")[-1]], 
       id + var1 ~ var2, value.var = 'value')[order(var1)]
#    id var1 alt pre
# 1:  a   d1   2   5
# 2:  b   d1   3   4
# 3:  c   d1   4   5
# 4:  d   d1   5   5
# 5:  a   d2   4  NA
# 6:  b   d2   5  NA
# 7:  c   d2   6  NA
# 8:  d   d2   7  NA
# 9:  a   d3   8   5
#10:  b   d3   9   5
#11:  c   d3  10   5
#12:  d   d3  11   5

目前,大多数R方法不能很好地处理这些类型的不平衡数据集,而是要求您首先将数据转换为“长”格式,进行一些转换,然后返回到“宽”格式。为此,我编写了
merged.stack
函数作为我的“splitstackshape”包的一部分,之所以这样命名是因为它将首先
stack
相关的数据列放入
列表
,然后
merge
将它们合并在一起

该方法类似于:

library(splitstackshape)
merged.stack(test_data, var.stubs = c("_alt", "_pre"), sep = "var.stubs", atStart = FALSE)
#     id .time_1 _alt _pre
#  1:  a demo_d1    2    5
#  2:  a demo_d2    4   NA
#  3:  a demo_d3    8    5
#  4:  b demo_d1    3    4
#  5:  b demo_d2    5   NA
#  6:  b demo_d3    9    5
#  7:  c demo_d1    4    5
#  8:  c demo_d2    6   NA
#  9:  c demo_d3   10    5
# 10:  d demo_d1    5    5
# 11:  d demo_d2    7   NA
# 12:  d demo_d3   11    5
然而,随着“data.table”给
melt
带来的改进,重新审视这种方法是有意义的

可以找到工作草稿,您可以使用以下功能加载相关功能:

source("https://gist.githubusercontent.com/mrdwab/ceded54b616bdc61cb0f/raw/c5a583267f8682a5afea1b551347eafdab618471/MELT.R")
用法很简单:指定数据集、存根以及存根是在变量名的开头还是结尾

library(data.table)
ReshapeLong_(test_data, stubs = c(alt = "_alt", pre = "_pre"), end_stub = TRUE)
#     id variable alt pre
#  1:  a  demo_d1   2   5
#  2:  b  demo_d1   3   4
#  3:  c  demo_d1   4   5
#  4:  d  demo_d1   5   5
#  5:  a  demo_d2   4  NA
#  6:  b  demo_d2   5  NA
#  7:  c  demo_d2   6  NA
#  8:  d  demo_d2   7  NA
#  9:  a  demo_d3   8   5
# 10:  b  demo_d3   9   5
# 11:  c  demo_d3  10   5
# 12:  d  demo_d3  11   5
简单的黑客程序是

test_data <- as.data.table(test_data)
test_data[,.NA:=NA]
melt(test_data, id='id', 
     measure = list(c('demo_d1_alt', 'demo_d2_alt', 'demo_d3_alt'),
                    c('demo_d1_pre', '.NA', 'demo_d3_pre')))

测试数据谢谢。所以,
melt
无法单独处理它?@Metrics为使代码正常工作,应该有相应的成对列。这里,我们有d3_pre在末尾。所以,它认为这是“d2_alt”的成对列。为了避免这种情况,请在转换为数据之前创建一列NAs,即
cbind(测试数据[1:4],演示数据[2\u pre=NA\u real\u,测试数据[5:6])
。因为我只需要创建一个变量,所以这是有效的。请参阅和了解导致我起草草案的原因。谢谢您的回答。
source("https://gist.githubusercontent.com/mrdwab/ceded54b616bdc61cb0f/raw/c5a583267f8682a5afea1b551347eafdab618471/MELT.R")
library(data.table)
ReshapeLong_(test_data, stubs = c(alt = "_alt", pre = "_pre"), end_stub = TRUE)
#     id variable alt pre
#  1:  a  demo_d1   2   5
#  2:  b  demo_d1   3   4
#  3:  c  demo_d1   4   5
#  4:  d  demo_d1   5   5
#  5:  a  demo_d2   4  NA
#  6:  b  demo_d2   5  NA
#  7:  c  demo_d2   6  NA
#  8:  d  demo_d2   7  NA
#  9:  a  demo_d3   8   5
# 10:  b  demo_d3   9   5
# 11:  c  demo_d3  10   5
# 12:  d  demo_d3  11   5
test_data <- as.data.table(test_data)
test_data[,.NA:=NA]
melt(test_data, id='id', 
     measure = list(c('demo_d1_alt', 'demo_d2_alt', 'demo_d3_alt'),
                    c('demo_d1_pre', '.NA', 'demo_d3_pre')))
test_data <- as.data.table(test_data)
test_data[,.NA:=NA]
melt(test_data, id='id', 
     measure = list(c('demo_d1_alt', 'demo_d2_alt', '.NA'),
                    c('demo_d1_pre', '.NA', 'demo_d3_pre')))