2017-10-18 63 views
1

考虑:长到宽重组通过ID和天

x <- data.frame(Participant=c("1","1","1","1","1","1","1","1","1","1", "2","2","2","2","2","2","2","2","2","2", 
           "3","3","3","3","3","3","3","3","3","3"), 
       Day= c("1","2","3","4","5","6","7","8","9","10","1","2","3","4","5","6","7","8","9","10", 
         "1","2","3","4","5","6","7","8","9","10"), 
       verbal=c(1,4,5,6,1,2,8,5,3,4,1,4,5,6,1,2,8,5,3,4,1,4,5,6,1,2,8,5,3,4), 
       spatial=c(1,6,7,3,5,1,6,7,3,5,1,6,7,3,5,1,6,7,3,5,1,6,7,3,5,1,6,7,3,5), 
       cognitive=c(5,6,3,5,7,1,2,3,6,1,6,7,3,5,1,6,7,3,5,1,6,7,3,5,7,4,2,5,7,4)) 

结果:

y <- data.frame(Participant=c("1","2","3"), 
       verbal1=c(1,4,5), 
       verbal2=c(1,4,5), 
       verbal3=c(1,4,5), 
       verbal4=c(1,4,5), 
       verbal5=c(1,4,5), 
       verbal6=c(1,4,5), 
       verbal7=c(1,4,5), 
       verbal8=c(1,4,5), 
       verbal9=c(1,4,5), 
       verbal10=c(1,4,5), 
       spatial1=c(1,6,7), 
       spatial2=c(1,6,7), 
       spatial3=c(1,6,7), 
       spatial4=c(1,6,7), 
       spatial5=c(1,6,7), 
       spatial6=c(1,6,7), 
       spatial7=c(1,6,7), 
       spatial8=c(1,6,7), 
       spatial9=c(1,6,7), 
       spatial10=c(1,6,7), 
       cognitive1=c(5,6,3), 
       cognitive2=c(5,6,3), 
       cognitive3=c(5,6,3), 
       cognitive4=c(5,6,3), 
       cognitive5=c(5,6,3), 
       cognitive6=c(5,6,3), 
       cognitive7=c(5,6,3), 
       cognitive8=c(5,6,3), 
       cognitive9=c(5,6,3), 
       cognitive10=c(5,6,3)) 

基本上,我有麻烦重组长格式的数据集,以宽格式。这里的问题是需要调用多个变量(口头的,空间的和认知的),所以我不能用TidyR传播函数来打它。这里的关键是要打破它分成三块在评论部分中找到:

解决方案:

x1 <- x %>% 
    select(ParticipantID, Day, verbal) %>% 
    mutate(Day=paste0('verbal', Day)) %>% 
    spread(Day, verbal) 


x2 <- x %>% 
    select(ParticipantID, Day, spatial) %>% 
    mutate(Day=paste0('spatial', Day)) %>% 
    spread(Day, spatial) 

x3 <- x %>% 
    select(ParticipantID, Day, cognitive) %>% 
    mutate(Day=paste0('cognitive', Day)) %>% 
    spread(Day, cognitive) 

final1 <- left_join(x1, x2, by=participant) 
final2 <- left_join(x2,final1, by=participant) 
+1

堆栈溢出不在这里为你做你的工作。尝试自己做这件事,并发布你的尝试。 –

回答

2

什么分解成组成部分,然后再结合到一起,就像这样:

library(dplyr) 
library(tidyr) 

x1 <- select(x, Participant, Day, verbal) %>% mutate(Day = paste0('verbal',Day)) 
x2 <- select(x, Participant, Day, spatial) %>% mutate(Day = paste0('spatial',Day)) 
x3 <- select(x, Participant, Day, cognitive) %>% mutate(Day = paste0('cognitive',Day)) 

final <- left_join(left_join(spread(x1, Day, verbal), spread(x2, Day, spatial), by = 'Participant'), spread(x3, Day, cognitive), by = 'Participant') 
final 

# Participant verbal1 verbal10 verbal2 verbal3 verbal4 verbal5 verbal6 verbal7 verbal8 verbal9 spatial1 spatial10 spatial2 spatial3 spatial4 spatial5 
# 1   1  1  4  4  5  6  1  2  8  5  3  1   5  6  7  3  5 
# 2   2  1  4  4  5  6  1  2  8  5  3  1   5  6  7  3  5 
# 3   3  1  4  4  5  6  1  2  8  5  3  1   5  6  7  3  5 
# spatial6 spatial7 spatial8 spatial9 cognitive1 cognitive10 cognitive2 cognitive3 cognitive4 cognitive5 cognitive6 cognitive7 cognitive8 cognitive9 
# 1  1  6  7  3   5   1   6   3   5   7   1   2   3   6 
# 2  1  6  7  3   6   1   7   3   5   1   6   7   3   5 
# 3  1  6  7  3   6   4   7   3   5   7   4   2   5   7 
+0

这个工程!但是,使数据集复杂化的是,我的数据集中有重复的行 - 有时候人们在一天内完成了两次调查,所以他们在第1天有两个条目。 修改我的原始问题: Day = c(1,1,2,3,4,5,6,7,8,9,10,1, “2”“3”“4”“5”“6”“7”“8”“9”“10” “1”“2”“3” 4“,”5“,”6“,”7“,”8“,”9“,”10“), 第1天有两个条目。当我使用您的解决方案时,”我得到一个重复的标识符行(41,42)“错误。我想保留重复的行,任何想法如何做到这一点? – D500

+0

没有办法做到这一点,因为你实质上要求的是有两列都被命名为Verbal1。如果只有1名参与者具有Verbal1,那么其他参与者将在该列中得到空值 - 这是期望的结果吗?如果是这样,我会建议预处理您的数据,如果参与者有重复,第二个重复的“日”将重新命名为“1a”,“1b”等,然后您将有列Verbal1,Verbal1a等。 – BigTimeStats

+0

感谢您的反馈@BigTimeStats! 我借用了你的技术,并根据重复的ID号拆分我的数据,然后在116和更高版本中重新命名它们 - 然后我将它们清理干净并缝合在一起。感谢您向我展示这一技术!以这种块来思考是非常有用的。 – D500