2017-10-18 110 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