R 如何将表格数据重塑为每组一行
我是一名R和编码新手,我正在寻找一种将下面的表a重新配置为表B的方法 表A: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
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 = '')