R 如何基于因子创建多路表?

R 如何基于因子创建多路表?,r,data-manipulation,presentation,R,Data Manipulation,Presentation,我一直在尝试根据因子数据创建带有结果的多路表 我的数据如下所示: Trial Room Mechanism Result A 1 Straight 0,5 A 1 Bendy 0,2 A 2 Straight 0.7 A 2 Bendy 0.3 B 1 Straight 0.6 B 1

我一直在尝试根据因子数据创建带有结果的多路表

我的数据如下所示:

Trial    Room    Mechanism    Result
A        1       Straight     0,5
A        1       Bendy        0,2
A        2       Straight     0.7
A        2       Bendy        0.3
B        1       Straight     0.6
B        1       Bendy        0.2
B        2       Straight     0.6
B        2       Bendy        0.2
事实上,大约有6个因素具有多个层次和一列结果

我想要的结果是这样的:

           Room 1      Room 2   
           A    B      A     B   
Straight  0.5   0.6    0.7   0.6
Bendy     0.2   0.2    0.3   0.2


是否有一个函数或包可以这样做

所有的搜索结果都产生了代码,可以根据data.table()或count()等因素生成多路频率表。这不是我要找的。也许我用错了关键词,或者在这个问题上有更多的信息


手动操作是一种选择,但不是首选。此外,我不是第一个需要这样做的人,所以我知道有办法

找不到合适的dupe,下面是如何排列和重新排列列的。诀窍是将
Room
Trial
变量指定为输出列。使用
tidyr
的一组新函数,
pivot\u wired/pivot\u long
,这一点特别容易。传播之后,一个简单的正则表达式可以帮助您按照所需的格式对列进行排序,即

library(dplyr)
library(tidyr)

df %>% 
 pivot_wider(id_cols = Mechanism, names_from = c(Room, Trial), values_from = Result) %>% 
 select(1, order(sub('_.*', '', names(.))))
这就给了,

#一个tible:2 x 5
机构'1_A``1_B``2_A``2_B`
1直0,50.6 0.7 0.6
2弯曲0,2 0.2 0.3 0.2

找不到合适的dupe,下面是如何排列和重新排列列的。诀窍是将
Room
Trial
变量指定为输出列。使用
tidyr
的一组新函数,
pivot\u wired/pivot\u long
,这一点特别容易。传播之后,一个简单的正则表达式可以帮助您按照所需的格式对列进行排序,即

library(dplyr)
library(tidyr)

df %>% 
 pivot_wider(id_cols = Mechanism, names_from = c(Room, Trial), values_from = Result) %>% 
 select(1, order(sub('_.*', '', names(.))))
这就给了,

#一个tible:2 x 5
机构'1_A``1_B``2_A``2_B`
1直0,50.6 0.7 0.6
2弯曲0,2 0.2 0.3 0.2

此处填写的是
数据。表
带有
dcast的版本

library(data.table)
dcast(setDT(df), Mechanism~paste0('Room', Room) + Trial, value.var = 'Result')

#   Mechanism Room1_A Room1_B Room2_A Room2_B
#1:     Bendy     0,2     0.2     0.3     0.2
#2:  Straight     0,5     0.6     0.7     0.6

此处填写的是
数据。表
带有
dcast的版本

library(data.table)
dcast(setDT(df), Mechanism~paste0('Room', Room) + Trial, value.var = 'Result')

#   Mechanism Room1_A Room1_B Room2_A Room2_B
#1:     Bendy     0,2     0.2     0.3     0.2
#2:  Straight     0,5     0.6     0.7     0.6

这是一个基本的R解决方案,其中使用
reformate()
重新格式化数据帧

df <- df[with(df,order(Room,Trial)),]
dfout <- reshape(within(df,RT <- apply(df[1:2],1,paste0,collapse = ""))[-(1:2)],
                 idvar = "Mechanism",
                 timevar = "RT",
                 direction = "wide")
数据

df <- structure(list(Trial = c("A", "A", "B", "B", "A", "A", "B", "B"
), Room = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Mechanism = c("Straight", 
"Bendy", "Straight", "Bendy", "Straight", "Bendy", "Straight", 
"Bendy"), Result = c(0.5, 0.2, 0.6, 0.2, 0.7, 0.3, 0.6, 0.2)), row.names = c(1L, 
2L, 5L, 6L, 3L, 4L, 7L, 8L), class = "data.frame")

df这是一个基本的R解决方案,其中
restrape()
用于重新格式化数据帧

df <- df[with(df,order(Room,Trial)),]
dfout <- reshape(within(df,RT <- apply(df[1:2],1,paste0,collapse = ""))[-(1:2)],
                 idvar = "Mechanism",
                 timevar = "RT",
                 direction = "wide")
数据

df <- structure(list(Trial = c("A", "A", "B", "B", "A", "A", "B", "B"
), Room = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), Mechanism = c("Straight", 
"Bendy", "Straight", "Bendy", "Straight", "Bendy", "Straight", 
"Bendy"), Result = c(0.5, 0.2, 0.6, 0.2, 0.7, 0.3, 0.6, 0.2)), row.names = c(1L, 
2L, 5L, 6L, 3L, 4L, 7L, 8L), class = "data.frame")
df可能:
库(重塑);cast(df,Mechanism~Trial+Room,value='Result')
Maybe:
library(重塑);铸造(df,机械装置~试验+试验室,值='结果')