我有以下列标题的数据:
Sheet Number, Year, Term, Class, Debate #, Role in Debate, Gender of Evaluator, Person #1 Clarity, Person #1 Effort, Person #1 Gender, Person #1 Origin, Debater Number, Person #2 Clarity, Person #2 Effort, Person #2 Gender, Person #2 Origin, Debater Number, Person #3 Clarity, Person #3 Effort, Person #3 Gender, Person #3 Origin, Debater Number, Person #4 Clarity, Person #4 Effort, Person #4 Gender, Person #4 Origin, Debater Number, Person #5 Clarity, Person #5 Effort, Person #5 Gender, Person #5 Origin, Debater Number, Person #6 Clarity, Person #6 Effort, Person #6 Gender, Person #6 Origin, Debater Number, Person #7 Clarity, Person #7 Effort, Person #7 Gender, Person #7 Origin, Debater Number, Person #8 Clarity, Person #8 Effort, Person #8 Gender, Person #8 Origin, Debater Number, Learned from Team 1, Learned from Team 2, Who won?, Sheet all 10s?, Evaluator Class Year
Run Code Online (Sandbox Code Playgroud)
我想将其转换为具有以下列标题的格式:
Sheet Number, Year, Term, Class, Debate #, Gender of Evaluator, Evaluator Class Year, Role in Debate, Debate Team Member #, Debater Number, Gender of Debate Team Member, Origin of Debate Team Member, Clarity of Debate Team Member, Effort of Debate Team Member, Learned from Team 1, Learned from Team 2, Who won?, Sheet all 10s?, =1 if Gender of Evaluator==Gender of Debater
Run Code Online (Sandbox Code Playgroud)
两者之间的主要区别在于,在第一种格式中,每个工作表编号都有5-8个与之关联的"人员".第二种格式,每个工作表编号都有一个与之关联的人(因此每个工作表编号出现多次,数据被"扩展").
我怎么能在R中完成这个?我一直在尝试使用'reshape'包.谢谢!
(我借此机会了解一点tidyr,我很高兴我做到了.)
正如@JamesKing建议的那样,你提供的并不是最好的MWE,所以我创建了一些结构相似的数据.我认为这一切都适用于您的示例,因此,通过一些解释,您应该能够将其转换为您的数据.话虽如此,因为看起来你开始使用Excel电子表格,所以提出一个简化gathering和separate数据的ING.
我的数据:
set.seed(1)
n <- 5
dat <- data.frame(
sheetNum = 1:n,
year = sample(2000:2025, size = n),
roleInDebate = sample(letters, size = n, replace = TRUE),
Clarity.1 = sample(10, size = n, replace = TRUE),
Effort.1 = sample(10, size = n, replace = TRUE),
Clarity.2 = sample(10, size = n, replace = TRUE),
Effort.2 = sample(10, size = n, replace = TRUE),
Clarity.3 = sample(10, size = n, replace = TRUE),
Effort.3 = sample(10, size = n, replace = TRUE))
dat
# sheetNum year roleInDebate Clarity.1 Effort.1 Clarity.2 Effort.2 Clarity.3
# 1 1 2006 x 3 5 10 4 5
# 2 2 2009 y 2 8 3 1 6
# 3 3 2013 r 7 10 7 4 5
# 4 4 2020 q 4 4 2 9 2
# 5 5 2004 b 8 8 3 4 9
Run Code Online (Sandbox Code Playgroud)
数据类型:
静态列:sheetNum,year,roleInDebate.此数据不会在其他任何地方使用,并会复制到每个人的每一行.什么都不是gathered,separated或spread基于这些列.
其余部分是列中包含数据的列.我的意思是Clarity.1将数据1存储在其中,并且需要巧妙地分离出来.虽然我每人只有两列,但这很容易转化为更多.
(如果你不熟悉%>%的中缀操作符dplyr和magrittr,我鼓励你们到别处研究它.它的方便和关键的理解这个建议的解决方案.)
现在,对于解决方案,非常简单:
library(tidyr)
library(dplyr)
dat %>%
gather(var, val, -sheetNum, -year, -roleInDebate) %>%
separate(var, c('skill', 'person'), '\\.') %>%
spread(skill, val)
# sheetNum year roleInDebate person Clarity Effort
# 1 1 2006 x 1 3 5
# 2 1 2006 x 2 10 4
# 3 1 2006 x 3 5 7
# 4 2 2009 y 1 2 8
# 5 2 2009 y 2 3 1
# 6 2 2009 y 3 6 8
# 7 3 2013 r 1 7 10
# 8 3 2013 r 2 7 4
# 9 3 2013 r 3 5 2
# 10 4 2020 q 1 4 4
# 11 4 2020 q 2 2 9
# 12 4 2020 q 3 2 8
# 13 5 2004 b 1 8 8
# 14 5 2004 b 2 3 4
# 15 5 2004 b 3 9 5
Run Code Online (Sandbox Code Playgroud)
要了解正在发生的事情,让我们逐步完成.该gather步骤简单地将未提及的列组合成键/值对列,如下所示:
dat %>% gather(var, val, -sheetNum, -year, -roleInDebate) %>% head()
# sheetNum year roleInDebate var val
# 1 1 2006 x Clarity.1 3
# 2 2 2009 y Clarity.1 2
# 3 3 2013 r Clarity.1 7
# 4 4 2020 q Clarity.1 4
# 5 5 2004 b Clarity.1 8
# 6 1 2006 x Effort.1 5
Run Code Online (Sandbox Code Playgroud)
请注意我之前包含的列是如何-逐字保存的.接下来,我们需要拆分(或separate)var列:
dat %>%
gather(var, val, -sheetNum, -year, -roleInDebate) %>%
separate(var, c('skill', 'person'), '\\.') %>% head()
# sheetNum year roleInDebate skill person val
# 1 1 2006 x Clarity 1 3
# 2 2 2009 y Clarity 1 2
# 3 3 2013 r Clarity 1 7
# 4 4 2020 q Clarity 1 4
# 5 5 2004 b Clarity 1 8
# 6 1 2006 x Effort 1 5
Run Code Online (Sandbox Code Playgroud)
不是很多发生在这里,但它是下一步非常重要:扩大数据,或spread从不同的键/值对列(现在用的荷兰国际集团它skill和val),创建新列命名Clarity和Effort,正如我们在解决看见, 以上.
希望这可以帮助.
顺便说一句:对于一个好的MWE,通常建议从dput(dat)哪里提供dat一个小而有代表性的数据结构的输出,这有助于我们理解起点和预期输出.在这里,data.frame两者都很小是合适的.