由于值重复,pivot_wider和唯一标识符存在问题

时间:2020-03-10 05:37:43

标签: r tidyverse tidyr

我正在尝试使用ivot_wider将数据集从长到宽移动,以便可以在其他程序中使用它。

我看过有关此主题的其他文章,但是解决方案无法解决我的问题。

我有一个称为“评级”的测量变量,该变量具有每个“岩石”和每个测试的值(“最大”,第一和第二)。我有一个名为“ turkcode”的id变量。

对于数据集中的每个人,有18个评分。问题是#8岩石有4个等级,我认为这就是为什么数据不会像我希望的那样更广泛地旋转。

这是数据的子集

structure(list(turkcode = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), .Label = c("100879", 
"104655", "108505", "110324", "110600", "112445", "114083", "115814", 
"116573", "117411", "117817", "118651", "119324", "121548", "121883", 
"121918", "123275", "123718", "125491", "127450", "127825", "128062", 
"129061", "131404", "135358", "135594", "135671", "135945", "137951", 
"138675", "139469", "140924", "145730", "147222", "148533", "150851", 
"153455", "158882", "164468", "166907", "169260", "171463", "172398", 
"175565", "177108", "179000", "180270", "183953", "185574", "185880", 
"185948", "186371", "187787", "189220", "190014", "192550", "193904", 
"195308", "196755", "197493", "198368", "200155", "200297", "201915", 
"214519", "215994", "217903", "218771", "219302", "220434", "222740", 
"223223", "224721", "225118", "225223", "229856", "229874", "231301", 
"232576", "233842", "234215", "237581", "239567", "240609", "241098", 
"241423", "242108", "244633", "246055", "251597", "252929", "255252", 
"256652", "259936", "274962", "277053", "279422", "280317", "282602", 
"283750", "285737", "286259", "287544", "288507", "290503", "291401", 
"291835", "292160", "294117", "297863", "298061", "299347", "299499", 
"301399", "304875", "305231", "306312", "307410", "308979", "311157", 
"311524", "311630", "318956", "318988", "319995", "321405", "324288", 
"327086", "327559", "328345", "328401", "330318", "330909", "332723", 
"334115", "334517", "335811", "335831", "337145", "338323", "338542", 
"338575", "340083", "341182", "343612", "343947", "344554", "346476", 
"349874", "350117", "350433", "350972", "351187", "355311", "356717", 
"359366", "360048", "360058", "361191", "361971", "362827", "363543", 
"367244", "374254", "374965", "376278", "377622", "382139", "382916", 
"384586", "385229", "386782", "388951", "389029", "390299", "390662", 
"396335", "396732", "398076", "398573", "399276", "399587", "403388", 
"406073", "406160", "411977", "412935", "417350", "420060", "421393", 
"422944", "424462", "427143", "429291", "430758", "431629", "431638", 
"431935", "432218", "433788", "434291", "436681", "437087", "439385", 
"439499", "440477", "440834", "441253", "441876", "443826", "444080", 
"447597", "452643", "454649", "457055", "457946", "463512", "464079", 
"464123", "467897", "468650", "470211", "471115", "471512", "475493", 
"476937", "479198", "482871", "484066", "484070", "485462", "486402", 
"491701", "491835", "499644", "501833", "502335", "502373", "504800", 
"507439", "507946", "507987", "509066", "513078", "515519", "517017", 
"517988", "519144", "519210", "519858", "522847", "523683", "525315", 
"528577", "532463", "532630", "533028", "539033", "539852", "540690", 
"546773", "546916", "549652", "551599", "554198", "556066", "559920", 
"560804", "560857", "562080", "562420", "563841", "565668", "565776", 
"566509", "569039", "572553", "575364", "576421", "576694", "576877", 
"577120", "577155", "577534", "577605", "578463", "578820", "578995", 
"580213", "581893", "582433", "582905", "583887", "584569", "585314", 
"585566", "587393", "589144", "592284", "594463", "596863", "601837", 
"602632", "604254", "605885", "609296", "609963", "610062", "612437", 
"612949", "613161", "614372", "614777", "615372", "615384", "616927", 
"618118", "620041", "620336", "621634", "622289", "624098", "626163", 
"626612", "627019", "627856", "630003", "630255", "634018", "634478", 
"635801", "638606", "640012", "641078", "641366", "641436", "641821", 
"642076", "642446", "643329", "643942", "644015", "646792", "647254", 
"647700", "649516", "650792", "650810", "651229", "652387", "652671", 
"654778", "657964", "658894", "660500", "660607", "664469", "666754", 
"666796", "668996", "669712", "671682", "673516", "675712", "677835", 
"678008", "679262", "680295", "686455", "690471", "691175", "692489", 
"694023", "696001", "698716", "700133", "700641", "707812", "707953", 
"708010", "708881", "713657", "715255", "715386", "716764", "718936", 
"719956", "725348", "727753", "728436", "729588", "730513", "731928", 
"732013", "732438", "733366", "733559", "734672", "735174", "735675", 
"737044", "737127", "741264", "745262", "748173", "748414", "748943", 
"749221", "749963", "750363", "753518", "754512", "754970", "758639", 
"760838", "761642", "766250", "770646", "772574", "773054", "775271", 
"776762", "778208", "779453", "781378", "781861", "782257", "785763", 
"785860", "787011", "790280", "791735", "791903", "792178", "796650", 
"796822", "796970", "798621", "802731", "804701", "805606", "807848", 
"809142", "810539", "812182", "812321", "814029", "814545", "814774", 
"815079", "816572", "824215", "825063", "827763", "829973", "829983", 
"830126", "832112", "832666", "833066", "834756", "835270", "835340", 
"837413", "837746", "839882", "846097", "847975", "848746", "851745", 
"851975", "856622", "858918", "859174", "859182", "859726", "859850", 
"862222", "864356", "865028", "869700", "871576", "872256", "873350", 
"873597", "875873", "883140", "886308", "886592", "886706", "892144", 
"893930", "894959", "896820", "900374", "901373", "902879", "904147", 
"905194", "906305", "908049", "908798", "911505", "913314", "915390", 
"915833", "919057", "922432", "924120", "925640", "927671", "932006", 
"936810", "936916", "938349", "940727", "941945", "942271", "943188", 
"944548", "945783", "947164", "948322", "949181", "951414", "952632", 
"955090", "956428", "956985", "959916", "960349", "962224", "962980", 
"964665", "967160", "967588", "969929", "972543", "972893", "977734", 
"978083", "978981", "980427", "980782", "981541", "981850", "982220", 
"983781", "985193", "986366", "988934", "989056", "991218", "991914", 
"995411", "995630", "995873", "995936", "996309"), class = "factor"), 
    aid = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("mem", 
    "noMem"), class = "factor"), gentest = structure(c(1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 
    2L, 1L, 2L), .Label = c("first", "second"), class = "factor"), 
    rocks = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 
    6L, 6L, 7L, 7L, 8L, 8L, 8L, 8L, 1L, 1L), .Label = c("R1", 
    "R2", "R3", "R4", "R5", "R6", "R7", "R8"), class = "factor"), 
    rating = c(7L, 5L, 2L, 7L, 4L, 2L, 6L, 3L, 3L, 2L, 3L, 3L, 
    2L, 1L, 3L, 6L, 3L, 2L, 2L, 4L), condition = structure(c(2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L), .Label = c("baseline", "category", "property"
    ), class = "factor"), order = structure(c(1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("after", "before", "none"), class = "factor")), row.names = c(NA, 
-20L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), groups = structure(list(
    turkcode = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L), .Label = c("100879", 
    "104655", "108505", "110324", "110600", "112445", "114083", 
    "115814", "116573", "117411", "117817", "118651", "119324", 
    "121548", "121883", "121918", "123275", "123718", "125491", 
    "127450", "127825", "128062", "129061", "131404", "135358", 
    "135594", "135671", "135945", "137951", "138675", "139469", 
    "140924", "145730", "147222", "148533", "150851", "153455", 
    "158882", "164468", "166907", "169260", "171463", "172398", 
    "175565", "177108", "179000", "180270", "183953", "185574", 
    "185880", "185948", "186371", "187787", "189220", "190014", 
    "192550", "193904", "195308", "196755", "197493", "198368", 
    "200155", "200297", "201915", "214519", "215994", "217903", 
    "218771", "219302", "220434", "222740", "223223", "224721", 
    "225118", "225223", "229856", "229874", "231301", "232576", 
    "233842", "234215", "237581", "239567", "240609", "241098", 
    "241423", "242108", "244633", "246055", "251597", "252929", 
    "255252", "256652", "259936", "274962", "277053", "279422", 
    "280317", "282602", "283750", "285737", "286259", "287544", 
    "288507", "290503", "291401", "291835", "292160", "294117", 
    "297863", "298061", "299347", "299499", "301399", "304875", 
    "305231", "306312", "307410", "308979", "311157", "311524", 
    "311630", "318956", "318988", "319995", "321405", "324288", 
    "327086", "327559", "328345", "328401", "330318", "330909", 
    "332723", "334115", "334517", "335811", "335831", "337145", 
    "338323", "338542", "338575", "340083", "341182", "343612", 
    "343947", "344554", "346476", "349874", "350117", "350433", 
    "350972", "351187", "355311", "356717", "359366", "360048", 
    "360058", "361191", "361971", "362827", "363543", "367244", 
    "374254", "374965", "376278", "377622", "382139", "382916", 
    "384586", "385229", "386782", "388951", "389029", "390299", 
    "390662", "396335", "396732", "398076", "398573", "399276", 
    "399587", "403388", "406073", "406160", "411977", "412935", 
    "417350", "420060", "421393", "422944", "424462", "427143", 
    "429291", "430758", "431629", "431638", "431935", "432218", 
    "433788", "434291", "436681", "437087", "439385", "439499", 
    "440477", "440834", "441253", "441876", "443826", "444080", 
    "447597", "452643", "454649", "457055", "457946", "463512", 
    "464079", "464123", "467897", "468650", "470211", "471115", 
    "471512", "475493", "476937", "479198", "482871", "484066", 
    "484070", "485462", "486402", "491701", "491835", "499644", 
    "501833", "502335", "502373", "504800", "507439", "507946", 
    "507987", "509066", "513078", "515519", "517017", "517988", 
    "519144", "519210", "519858", "522847", "523683", "525315", 
    "528577", "532463", "532630", "533028", "539033", "539852", 
    "540690", "546773", "546916", "549652", "551599", "554198", 
    "556066", "559920", "560804", "560857", "562080", "562420", 
    "563841", "565668", "565776", "566509", "569039", "572553", 
    "575364", "576421", "576694", "576877", "577120", "577155", 
    "577534", "577605", "578463", "578820", "578995", "580213", 
    "581893", "582433", "582905", "583887", "584569", "585314", 
    "585566", "587393", "589144", "592284", "594463", "596863", 
    "601837", "602632", "604254", "605885", "609296", "609963", 
    "610062", "612437", "612949", "613161", "614372", "614777", 
    "615372", "615384", "616927", "618118", "620041", "620336", 
    "621634", "622289", "624098", "626163", "626612", "627019", 
    "627856", "630003", "630255", "634018", "634478", "635801", 
    "638606", "640012", "641078", "641366", "641436", "641821", 
    "642076", "642446", "643329", "643942", "644015", "646792", 
    "647254", "647700", "649516", "650792", "650810", "651229", 
    "652387", "652671", "654778", "657964", "658894", "660500", 
    "660607", "664469", "666754", "666796", "668996", "669712", 
    "671682", "673516", "675712", "677835", "678008", "679262", 
    "680295", "686455", "690471", "691175", "692489", "694023", 
    "696001", "698716", "700133", "700641", "707812", "707953", 
    "708010", "708881", "713657", "715255", "715386", "716764", 
    "718936", "719956", "725348", "727753", "728436", "729588", 
    "730513", "731928", "732013", "732438", "733366", "733559", 
    "734672", "735174", "735675", "737044", "737127", "741264", 
    "745262", "748173", "748414", "748943", "749221", "749963", 
    "750363", "753518", "754512", "754970", "758639", "760838", 
    "761642", "766250", "770646", "772574", "773054", "775271", 
    "776762", "778208", "779453", "781378", "781861", "782257", 
    "785763", "785860", "787011", "790280", "791735", "791903", 
    "792178", "796650", "796822", "796970", "798621", "802731", 
    "804701", "805606", "807848", "809142", "810539", "812182", 
    "812321", "814029", "814545", "814774", "815079", "816572", 
    "824215", "825063", "827763", "829973", "829983", "830126", 
    "832112", "832666", "833066", "834756", "835270", "835340", 
    "837413", "837746", "839882", "846097", "847975", "848746", 
    "851745", "851975", "856622", "858918", "859174", "859182", 
    "859726", "859850", "862222", "864356", "865028", "869700", 
    "871576", "872256", "873350", "873597", "875873", "883140", 
    "886308", "886592", "886706", "892144", "893930", "894959", 
    "896820", "900374", "901373", "902879", "904147", "905194", 
    "906305", "908049", "908798", "911505", "913314", "915390", 
    "915833", "919057", "922432", "924120", "925640", "927671", 
    "932006", "936810", "936916", "938349", "940727", "941945", 
    "942271", "943188", "944548", "945783", "947164", "948322", 
    "949181", "951414", "952632", "955090", "956428", "956985", 
    "959916", "960349", "962224", "962980", "964665", "967160", 
    "967588", "969929", "972543", "972893", "977734", "978083", 
    "978981", "980427", "980782", "981541", "981850", "982220", 
    "983781", "985193", "986366", "988934", "989056", "991218", 
    "991914", "995411", "995630", "995873", "995936", "996309"
    ), class = "factor"), rocks = structure(c(1L, 1L, 2L, 2L, 
    3L, 3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 1L, 1L), .Label = c("R1", 
    "R2", "R3", "R4", "R5", "R6", "R7", "R8"), class = "factor"), 
    gentest = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("first", 
    "second"), class = "factor"), .rows = list(1L, 2L, 3L, 4L, 
        5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15:16, 17:18, 
        19L, 20L)), row.names = c(NA, -18L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE))

有人知道我如何修改#8岩石的第二组评级,以便我可以更广泛地旋转数据,甚至可以完全从数据集中排除该数据吗?

编辑:

这是我希望输出看起来如何的示例

id <- rep("100879", times = 6)
aid <- rep("mem", times = 6)
test <- rep(c("first", "second"), times = 3)
order <- rep("after", times = 6)
condition <- rep ("cat", times = 6)
R1 <-  sample(0:9, 6, replace=T)
R2 <- sample(0:9, 6, replace=T)
R3 <- sample(0:9, 6, replace=T)
R4 <- sample(0:9, 6, replace=T)
R5 <- sample(0:9, 6, replace=T)
R6 <- sample(0:9, 6, replace=T)
R7 <- sample(0:9, 6, replace=T)
R8 <- sample(0:9, 6, replace=T)

df <- cbind(id, aid, test, order, condition, R1, R2, R3, R4, R5, R6, R7, R8)

2 个答案:

答案 0 :(得分:1)

另一个使用pivot_widerseparate的选项

library(dplyr)
library(tidyr)
#short version, but you will end up with R1-R8 in list foramt
df %>% 
  pivot_wider(id_cols = c("turkcode", "aid", "gentest", "condition", "order"),
              names_from = "rocks", values_from = "rating", values_fn = list(rating = list))

#clean version
df %>% 
   #id_cols: A set of columns that uniquely identifies each observation.
   #Defaults to all columns in data except for the columns specified in names_from and values_from.
   pivot_wider(id_cols = c("turkcode", "aid", "gentest", "condition", "order"), 
               names_from = "rocks", 
               values_from = "rating", 
               values_fn = list(rating = ~paste(., collapse = ","))
               #values_fn = list(rating = mean)  
               #,values_fill = list(rating=0)
               ) %>% 
   separate(R8, into = c('R8','R8_1'))

# A tibble: 4 x 14
# Groups:   turkcode, gentest [1,118]
  turkcode aid   gentest condition order R1    R2    R3    R4    R5    R6    R7    R8    R8_1 
  <fct>    <fct> <fct>   <fct>     <fct> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 100879   mem   first   category  after 7     2     4     6     3     3     2     3     6    
2 100879   mem   second  category  after 5     7     2     3     2     3     1     3     2    
3 104655   mem   first   category  after 2     NA    NA    NA    NA    NA    NA    NA    NA   
4 104655   mem   second  category  after 4     NA    NA    NA    NA    NA    NA    NA    NA 

答案 1 :(得分:1)

一个data.table建议

library( data.table )
#set data as data.table
setDT( mydata )
#create rowid by group
mydata[, row_id := rowidv( mydata, cols = c("turkcode", "aid", "gentest", "condition", "order", "rocks") ) ]
#create new rocks-column to group on
mydata[, rocks2 := paste0( rocks, ifelse( row_id == 1, "", paste0("_",row_id ) ) ) ]
#now cast to wide
dcast( mydata, turkcode + aid + gentest + condition + order ~ rocks2, value.var = "rating" )


#    turkcode aid gentest condition order R1 R2 R3 R4 R5 R6 R7 R8 R8_2
# 1:   100879 mem   first  category after  7  2  4  6  3  3  2  3    6
# 2:   100879 mem  second  category after  5  7  2  3  2  3  1  3    2
# 3:   104655 mem   first  category after  2 NA NA NA NA NA NA NA   NA
# 4:   104655 mem  second  category after  4 NA NA NA NA NA NA NA   NA