Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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_Reshape - Fatal编程技术网

R 如何将表格数据重塑为每组一行

R 如何将表格数据重塑为每组一行,r,reshape,R,Reshape,我是一名R和编码新手,我正在寻找一种将下面的表a重新配置为表B的方法 表A: type x1 x2 x3 A 4 6 9 A 7 4 1 A 9 6 2 B 1 3 8 B 2 7 9 我正在寻找代码,将转换为以下内容 表B: type x1 x2 x3 x1' x2' x3' x1'' x2'' x3'' A 4 6 9 7

我是一名R和编码新手,我正在寻找一种将下面的表a重新配置为表B的方法

表A:

type   x1  x2  x3  
A      4   6   9  
A      7   4   1  
A      9   6   2   
B      1   3   8  
B      2   7   9
我正在寻找代码,将转换为以下内容

表B:

type   x1  x2  x3  x1'  x2'  x3'  x1'' x2'' x3''  
A      4    6   9   7    4   1    9     6   2  
B      1    3   8   2    7   9   

真正的表A超过150000行36列。具有2100个唯一类型值

谢谢你的帮助


-Shawn

尝试一下,解决方案并不是那么简洁,给你一个提示吧。我认为很多事情都可以改进

但最后,我们必须在这里介绍NAs:

zz <- "type   x1  x2  x3  
A      4   6   9  
A      7   4   1  
A      9   6   2   
B      1   3   8  
B      2   7   9"

dA <- read.table(text=zz, header=T)


tmp<-(sapply(unique(dA$type), FUN=function(x) as.vector(t(dA[dA$type == x, -1]))))

t(sapply(tmp, '[', seq(max(sapply(tmp, length)))))
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    4    6    9    7    4    1    9    6    2
[2,]    1    3    8    2    7    9   NA   NA   NA

试一试,答案就不那么简洁了,只是给你一个提示。我认为很多事情都可以改进

但最后,我们必须在这里介绍NAs:

zz <- "type   x1  x2  x3  
A      4   6   9  
A      7   4   1  
A      9   6   2   
B      1   3   8  
B      2   7   9"

dA <- read.table(text=zz, header=T)


tmp<-(sapply(unique(dA$type), FUN=function(x) as.vector(t(dA[dA$type == x, -1]))))

t(sapply(tmp, '[', seq(max(sapply(tmp, length)))))
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    4    6    9    7    4    1    9    6    2
[2,]    1    3    8    2    7    9   NA   NA   NA

@Hack-R答案的变化:

A$num <- with(A, ave(as.character(type), type, FUN=seq_along) )
tmp <- cbind(A[c(1,5)], stack(A[2:4]))
tmp$time <- paste(tmp$ind, tmp$num, sep=".")

reshape(tmp[c("type","time","values")], idvar="type", timevar="time", direction="wide")

#  type values.x1.1 values.x1.2 values.x1.3 values.x2.1 values.x2.2 values.x2.3 values.x3.1 values.x3.2 values.x3.3
#1    A           4           7           9           6           4           6           9           1           2
#4    B           1           2          NA           3           7          NA           8           9          NA

@Hack-R答案的变化:

A$num <- with(A, ave(as.character(type), type, FUN=seq_along) )
tmp <- cbind(A[c(1,5)], stack(A[2:4]))
tmp$time <- paste(tmp$ind, tmp$num, sep=".")

reshape(tmp[c("type","time","values")], idvar="type", timevar="time", direction="wide")

#  type values.x1.1 values.x1.2 values.x1.3 values.x2.1 values.x2.2 values.x2.3 values.x3.1 values.x3.2 values.x3.3
#1    A           4           7           9           6           4           6           9           1           2
#4    B           1           2          NA           3           7          NA           8           9          NA

对我来说,这个解决方案似乎相当简单

# split the data frame by type and use unlist, which will provide names
ld <- lapply(split(d[-1], d[["type"]]), unlist)

# gather all the unique names in the list
ldNames <- Reduce(unique, lapply(ld, names))

# use the names to index each list element, which makes them
# all of equal length and suitable for row binding.  
do.call(rbind, lapply(ld, function(x) x[ldNames]))
#   x11 x12 x13 x21 x22 x23 x31 x32 x33
# A   4   7   9   6   4   6   9   1   2
# B   1   2  NA   3   7  NA   8   9  NA

对我来说,这个解决方案似乎相当简单

# split the data frame by type and use unlist, which will provide names
ld <- lapply(split(d[-1], d[["type"]]), unlist)

# gather all the unique names in the list
ldNames <- Reduce(unique, lapply(ld, names))

# use the names to index each list element, which makes them
# all of equal length and suitable for row binding.  
do.call(rbind, lapply(ld, function(x) x[ldNames]))
#   x11 x12 x13 x21 x22 x23 x31 x32 x33
# A   4   7   9   6   4   6   9   1   2
# B   1   2  NA   3   7  NA   8   9  NA

有点晚了,但这也可以通过data.table包的dcast函数轻松完成,因为您可以在其中使用多个value.var:

其中:

您也可以在base R中使用以下工具执行此操作:

d$num <- ave(d$x1, d$type, FUN = seq_along)
reshape(d, idvar = 'type', direction = 'wide', timevar = 'num', sep = '')

有点晚了,但这也可以通过data.table包的dcast函数轻松完成,因为您可以在其中使用多个value.var:

其中:

您也可以在base R中使用以下工具执行此操作:

d$num <- ave(d$x1, d$type, FUN = seq_along)
reshape(d, idvar = 'type', direction = 'wide', timevar = 'num', sep = '')


欢迎来到StackOverflow!我注意到向量B是多维的,所以用R的说法我们称之为data.frame或矩阵。这就是你的意思吗?或者你想要3个独立的向量?我们也可以称向量B为矩阵。我对原始问题进行了编辑,使其更加清晰。谢谢当然我提出了一个特别的解决方案,然后我们遭到了否决票的攻击,没有任何评论,所以我不得不删除它。如果您的数据很大,或者您需要经常这样做,我们应该找到一个更具编程性的解决方案。唯一真正的困难是,在这种格式中,我们需要为缺少的B单元格添加NA。因此,我认为使用fill=T和for循环、cbind和rbind是一种方法。实际的表a超过150000行36列。有2100个唯一的类型值。@Hack-R它不是怪物,因为它是对示例的文字提取,不适用于任何实际数据。答案是对社会毫无帮助。请随时改进帖子。欢迎来到StackOverflow!我注意到向量B是多维的,所以用R的说法我们称之为data.frame或矩阵。这就是你的意思吗?或者你想要3个独立的向量?我们也可以称向量B为矩阵。我对原始问题进行了编辑,使其更加清晰。谢谢当然我提出了一个特别的解决方案,然后我们遭到了否决票的攻击,没有任何评论,所以我不得不删除它。如果您的数据很大,或者您需要经常这样做,我们应该找到一个更具编程性的解决方案。唯一真正的困难是,在这种格式中,我们需要为缺少的B单元格添加NA。因此,我认为使用fill=T和for循环、cbind和rbind是一种方法。实际的表a超过150000行36列。有2100个唯一的类型值。@Hack-R它不是怪物,因为它是对示例的文字提取,不适用于任何实际数据。答案是对社会毫无帮助。请随意改进这篇文章。我认为你的逻辑是正确的,但可以简化一点。看我的答案,我认为它和我想的一样——这是一个看似困难的问题question@thelatemail我毫不怀疑你是对的。我想你的逻辑是正确的,但可以简化一点。看我的答案,我认为它和我想的一样——这是一个看似困难的问题question@thelatemail我毫不怀疑你是对的。我将+1您的答案HI-我不知道如何使用@Hack-R的答案。@SDM1212-根据Hack-R的逻辑,它本身就是一个完整的答案。你不必把它和其他任何东西一起使用。好吧,我开始理解了,我得到了这个例子。因此,对于实际数据,OB的数量是有限的。将发生变化,但总有22个变量。我不确定如何更改此示例以处理我的真实数据。您好-我不确定如何将其与@Hack-R的答案一起使用。@SDM1212-根据Hack-R的逻辑,它本身就是一个完整的答案。你不必把它和其他任何东西一起使用。好吧,我开始理解了,我得到了这个例子。因此,对于实际数据,OB的数量是有限的。将发生变化,但总有22个变量。我不知道如何改变这个例子来处理我的真实数据。我很喜欢lapply和split相结合的方法。太好了+1.但是,B的最终输出与问题不匹配,您可以更新解决方案;最后一个问题。我们需要类型为的列具有列标题。@SDM1212我在末尾添加了最后一行以添加类型列。希望有帮助@佐塔-完美!谢谢你的帮助。我真的很喜欢
采用搭接与劈裂相结合的方法。太好了+1.但是,B的最终输出与问题不匹配,您可以更新解决方案;最后一个问题。我们需要类型为的列具有列标题。@SDM1212我在末尾添加了最后一行以添加类型列。希望有帮助@佐塔-完美!谢谢你的帮助。
   type x11 x12 x13 x21 x22 x23 x31 x32 x33
1:    A   4   7   9   6   4   6   9   1   2
2:    B   1   2  NA   3   7  NA   8   9  NA
d$num <- ave(d$x1, d$type, FUN = seq_along)
reshape(d, idvar = 'type', direction = 'wide', timevar = 'num', sep = '')