This question already has answers here:
Reshaping multiple sets of measurement columns (wide format) into single columns (long format)
(7个答案)
3年前关闭。
我需要将宽表重整为长格式,但为每个记录保留多个字段,例如:
我具有使用
(7个答案)
3年前关闭。
我需要将宽表重整为长格式,但为每个记录保留多个字段,例如:
dw <- read.table(header=T, text='
sbj f1.avg f1.sd f2.avg f2.sd blabla
A 10 6 50 10 bA
B 12 5 70 11 bB
C 20 7 20 8 bC
D 22 8 22 9 bD
')
# Now I want to melt this table, keeping both AVG and SD as separate fields for each measurement, to get something like this:
# sbj var avg sd blabla
# A f1 10 6 bA
# A f2 50 10 bA
# B f1 12 5 bB
# B f2 70 11 bB
# C f1 20 7 bC
# C f2 20 8 bC
# D f1 22 8 bD
# D f2 22 9 bD
我具有使用
melt
和reshape
的基本知识,但是对于我来说如何应用这种重塑并不明显。 最佳答案
reshape
使用适当的参数执行此操作。varying
列出以宽格式存在但以长格式分成多行的列。 v.names
是等效的长格式。在两者之间,创建映射。
从?reshape
:
给定这些varying
和v.names
参数,reshape
足够聪明,可以看到我已指定索引在此处的点之前(即1.x,1.y,2.x,2.y顺序)。请注意,原始数据具有按此顺序排列的列,因此我们可以为此示例数据指定varying=2:5
,但这通常并不安全。
给定times
和v.names
的值后,reshape
将varying
字符上的.
列拆分(默认的sep
参数)以在输出中创建这些列。times
指定将在创建的var
列中使用的值,并将v.names
粘贴到这些值上以获取宽格式的列名,以映射到结果。
最后,idvar
被指定为sbj
列,该列标识宽格式的各个记录(感谢@thelatemail)。
reshape(dw, direction='long',
varying=c('f1.avg', 'f1.sd', 'f2.avg', 'f2.sd'),
timevar='var',
times=c('f1', 'f2'),
v.names=c('avg', 'sd'),
idvar='sbj')
## sbj blabla var avg sd
## A.f1 A bA f1 10 6
## B.f1 B bB f1 12 5
## C.f1 C bC f1 20 7
## D.f1 D bD f1 22 8
## A.f2 A bA f2 50 10
## B.f2 B bB f2 70 11
## C.f2 C bC f2 20 8
## D.f2 D bD f2 22 9
关于r - 将多个值列从宽变长为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23945350/
10-12 20:46