将R数据帧从长格式转换为宽格式,但组大小不同,用于qcc

将R数据帧从长格式转换为宽格式,但组大小不同,用于qcc,r,reshape,qcc,R,Reshape,Qcc,我想将数据帧从长格式转换为宽格式,但组大小不同 最终将用于“qcc”,这需要一个数据框或矩阵,每行由一个组组成,在样本较少的组中使用NA 下面的代码将创建一个示例数据集,并显示手动转换为所需格式 # This is an example of the initial data that I have # * 10 sample measurements, over 3 groups with 3, 2, and 5 elements respectively x <- rnorm(10)

我想将数据帧从长格式转换为宽格式,但组大小不同

最终将用于“qcc”,这需要一个数据框或矩阵,每行由一个组组成,在样本较少的组中使用NA

下面的代码将创建一个示例数据集,并显示手动转换为所需格式

# This is an example of the initial data that I have
# * 10 sample measurements, over 3 groups with 3, 2, and 5 elements respectively
x <- rnorm(10)
x_df <- data.frame( time = c( rep('2001 Q1',3), rep('2001 Q2',2), rep('2001 Q3',5) ), measure = x )
x_df

# This is a manual conversion into the desired format
x_pad <- c( x[1:3], NA, NA, x[4:5], NA, NA, NA, x[6:10] )
x_matrix <- matrix( x_pad, nrow = 3, ncol = 5, byrow = TRUE, dimnames = list(c('2001 Q1','2001 Q2','2001 Q3')) )
x_matrix # desired format

# An example of how it will be used
library(qcc)
plot(qcc(x_matrix, type = 'xbar', plot = FALSE))
。。。对此

              [,1]        [,2]       [,3]      [,4]      [,5]
2001 Q1  0.1468068  0.53593193  0.5609797        NA        NA
2001 Q2 -1.4810269  0.18150972         NA        NA        NA
2001 Q3  1.7201815 -0.08480855 -2.2320888 -1.152691 0.5797502
也许有一个简单的方法(也许是一些我不熟悉的重塑或重塑铸造的用法?),但到目前为止,大量的搜索并没有帮到我

谢谢你的帮助

==========

根据以下解决方案之一,以下内容将生成最终qcc xbar图,包括组标签:

library(splitstackshape)
out_df <- dcast( getanID( x_df, 'time' ), time~.id, value.var='measure' )
qcc( out_df[,-1], type = 'xbar', labels = out_df[,1] )
库(splitstackshape)

out_df您将需要一个中间变量,该变量提供一个“在时间内”id。您可以创建它并像这样进行重塑

library(tidyr)
library(dplyr)

group_by(X, time) %>%
  mutate(seq = 1:n()) %>%
  ungroup() %>%
  spread(seq, measure)

您可以使用
splitstackshape
中的
getanID创建序列列('.id'),并使用
dcast
from
data.table
将长格式转换为宽格式。
splitstackshape
的输出是一个data.table。加载
splitstackshape
时,还会加载data.table。因此,如果您已经拥有data.table的devel版本,那么也可以使用
data.table
中的
dcast

library(splitstackshape)
dcast(getanID(df1, 'time'), time~.id, value.var='measure')
#     time          1           2          3         4         5
#1: 2001 Q1  0.1468068  0.53593193  0.5609797        NA        NA
#2: 2001 Q2 -1.4810269  0.18150972         NA        NA        NA
#3: 2001 Q3  1.7201815 -0.08480855 -2.2320888 -1.152691 0.5797502
更新 正如@snoram在评论中提到的,函数
rowid
from
data.table
使得仅使用
data.table
变得更容易

library(data.table)
dcast(setDT(df1), time ~ rowid(time), value.var = "measure")

另一种
splitstackshape
方法

cSplit(setDT(df)[, toString(measure), by='time'], 'V1', ',')

#      time       V1_1        V1_2       V1_3      V1_4      V1_5
#1: 2001 Q1  0.1468068  0.53593193  0.5609797        NA        NA
#2: 2001 Q2 -1.4810269  0.18150972         NA        NA        NA
#3: 2001 Q3  1.7201815 -0.08480855 -2.2320888 -1.152691 0.5797502
或者使用
devel
版本的
data.table
通过分组列“time”将“measure”粘贴在一起后,类似的方法是使用
tstrsplit
拆分从
toString(measure)
生成的“V1”列


此外,我们还可以在
tstrsplit
中添加
type.convert=TRUE
,以转换拆分列的
class
。默认情况下,它是
FALSE

,这是一种可爱的方式。我没有想到这一点。谢谢@akrun:)我想我是从你的一个老回答中知道的。使用devel版本,你也可以使用
tstrsplit
。类似于
setDT(df1)[,toString(measure),by='time'][,c(list(time),tstrsplit(V1',)))]
您的解决方案更紧凑。我还要补充一点。我特别喜欢这个解决方案,因为它非常简洁,而且它保持了数据帧的状态。”qcc似乎不太喜欢数据表。不确定这是否正确,但我将编辑我的问题,将如何在实际的qcc绘图中使用上述解决方案也包括在内,以防有人发现这个问题正在寻找qcc解决方案。@JChou如果您想将输出转换为
data.frame
,您可以使用
setDF(res)
where
res谢谢,令人惊叹的!我在数据表上做了一大堆as.data.frame()转换。老实说,我只需要了解数据表!(一般来说,我对R比较陌生)。我相信在2018年人们会这样做:
dcast(x_df,time~rowid(time),measure.vars=“measure”)
,不需要
splitstackshape
。谢谢!这使我避免了以一种非常肮脏的方式做这件事。还有一个
行编号()
也很方便。这救了我!我不知道我必须在
groupby()
spread()之间使用
ungroup()
。你知道为什么这是必要的吗?老实说,我不知道你是否必须这样做。我只是有一个强迫性的习惯,那就是取消数据分组,除非我有理由在后续命令中保持分组。无论是否解组,我都会在这个数据样本上得到相同的结果。
cSplit(setDT(df)[, toString(measure), by='time'], 'V1', ',')

#      time       V1_1        V1_2       V1_3      V1_4      V1_5
#1: 2001 Q1  0.1468068  0.53593193  0.5609797        NA        NA
#2: 2001 Q2 -1.4810269  0.18150972         NA        NA        NA
#3: 2001 Q3  1.7201815 -0.08480855 -2.2320888 -1.152691 0.5797502
 setDT(df)[, toString(measure), by ='time'][, c(list(time), tstrsplit(V1, ', '))]