R: установка фрейма данных как минимум на несколько лет подряд

#r #aggregate #data-cleaning

#r #aggregate #очистка данных

Вопрос:

У меня есть большой фрейм данных со следующей структурой:

 data <- data.frame(id = c(rep("A", 10), rep("B", 10), rep("C", 10), rep("D", 10)), 
                   year = rep(2008:2017, 4), 
                   value = c(rnorm(10, mean = 100, sd = 20), 
                             rnorm(10, mean = 100, sd = 20), 
                             rnorm(4, mean = 100, sd = 20), 
                             rep(NA, 2), 
                             rnorm(4, mean = 100, sd = 20), 
                             rnorm(2, mean = 100, sd = 20), 
                             rep(NA, 8))
                  )
  

Во-первых, я хочу очистить данные, включив данные только для тех, id у value которых есть данные по крайней мере за пять лет из десяти общих лет в выборке данных. Мой текущий подход заключается в агрегировании данных с использованием length , сохранении id данных, удовлетворяющих требованию, в виде строки, а затем использовании указанной строки для подмножества исходных данных:

 data[data$id %in% as.character(subset(aggregate(value ~ id, data = data, FUN = length), value >= 5)$id), ]
  

Это исключило бы, D поскольку в нем есть value данные только за два года.

Однако на втором шаге я также хотел бы исключить его C на том основании, что он предоставляет данные не за пять последовательных лет, а только за два периода по четыре года каждый. Какой способ сделать это был бы наиболее удобным для начинающих? Пожалуйста, обратите внимание, что я ни в коем случае не настаиваю на предыдущих шагах, если существуют более элегантные или изощренные шаги.


Редактировать:

Из-за последующих вопросов, связанных с исходными данными, это выходные данные dput(head(data)) ( DSCD соответствует id , WC02999 value year , , это то же самое):

 structure(list(DSCD = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("13082U", 
"13410M", "13489T", "13519D", "13542D", "135490", "13635T", "13643N", 
"13658P", "13702V", "13703E", "13703L", "13725W", "13760R", "13767F", 
"13767M", "13807C", "13906U", "13922L", "13925P", "13966W", "13968J", 
"13970M", "14048T", "142401", "142439", "142586", "142706", "142789", 
"142792", "142809", "142947", "142948", "143170", "143171", "143189", 
"143207", "143238", "143446", "143553", "143576", "14360D", "143635", 
"143641", "143710", "143711", "143723", "143728", "143787", "143796", 
"143984", "14530M", "14530U", "14858W", "14907P", "15144T", "15314M", 
"15349L", "15407X", "255083", "2566RQ", "26019X", "2622K8", "2622LM", 
"2623J2", "2628HQ", "263394", "263399", "263466", "263659", "263860", 
"264348", "264403", "264502", "264716", "264721", "264723", "265104", 
"265624", "269377", "269491", "269520", "269968", "269973", "27007F", 
"270084", "270520", "270522", "270550", "270903", "270950", "271001", 
"27183E", "27194R", "27225R", "273293", "273296", "273298", "273300", 
"27421F", "27421M", "27421N", "27421P", "27422H", "27422J", "27422W", 
"27423J", "27423M", "27423R", "27424C", "27424L", "275192", "275297", 
"275344", "275350", "275354", "275356", "275367", "275497", "275508", 
"275510", "275512", "275514", "275516", "275518", "275536", "275549", 
"275552", "275554", "275556", "275562", "275577", "275579", "275580", 
"275583", "275590", "275598", "275822", "275855", "275903", "27598M", 
"27605Q", "276355", "276363", "276452", "276461", "276464", "276466", 
"278147", "278180", "278248", "278333", "278413", "278415", "278417", 
"278421", "278603", "278609", "278610", "278650", "278652", "278655", 
"278657", "278659", "278712", "278713", "278946", "280592", "280598", 
"280751", "280754", "280766", "280833", "281876", "28198R", "282398", 
"283766", "283806", "283998", "284265", "284267", "284304", "285240", 
"285242", "285246", "28539J", "285575", "285577", "285579", "2865J8", 
"287251", "287254", "287257", "287259", "287265", "287489", "287931", 
"287936", "287938", "287941", "287943", "288501", "288553", "288558", 
"288724", "288744", "288746", "288748", "288750", "288752", "288754", 
"28982V", "289889", "28990K", "290205", "290255", "290256", "290259", 
"290298", "290300", "290657", "290659", "290663", "290665", "290797", 
"290814", "290816", "290818", "290906", "290943", "291264", "291599", 
"291601", "291742", "291746", "291748", "291750", "291752", "291774", 
"291776", "291778", "29237N", "29251M", "295053", "295057", "295059", 
"295196", "295210", "295360", "295362", "295364", "295675", "295677", 
"295679", "295681", "295683", "295685", "295686", "295707", "295708", 
"295908", "295909", "295912", "296109", "296153", "296154", "296156", 
"296303", "296305", "296307", "296410", "296414", "296420", "29649E", 
"296628", "296630", "296746", "296748", "296750", "296752", "29764Q", 
"298551", "298687", "299014", "29946N", "299479", "29955U", "29967U", 
"299685", "30061V", "300623", "300951", "301573", "301575", "30169F", 
"301774", "30244P", "30409V", "307001", "307005", "307010", "307014", 
"307055", "307076", "307077", "307093", "307230", "307263", "307288", 
"307290", "307291", "307314", "307315", "307420", "307524", "307550", 
"307636", "307668", "307694", "307705", "308398", "308918", "308930", 
"308994", "309065", "309111", "309354", "309642", "309735", "309869", 
"309873", "309899", "31131W", "31172T", "31178L", "31209N", "31245C", 
"31311H", "31333F", "31341D", "31446E", "31466D", "31689E", "31774V", 
"31915V", "31915W", "31948P", "32000F", "32085X", "32139T", "32141M", 
"32146D", "32187V", "32197D", "32309D", "32318H", "32320H", "32331J", 
"32364X", "32396J", "32396L", "32507N", "32508D", "32551W", "32564F", 
"32606U", "32633H", "32647K", "32674V", "32744F", "32766R", "32798R", 
"32799T", "32854P", "32949T", "35615H", "35623C", "35631J", "35649C", 
"35654N", "35654V", "35661J", "35700K", "35733D", "35785W", "35786F", 
"35904L", "35923C", "35934N", "35940Q", "35975T", "35983E", "35993H", 
"35993N", "36055V", "36061Q", "36069C", "36073V", "36079W", "36082V", 
"36108D", "36122Q", "36133K", "36133M", "36133P", "36133R", "36135V", 
"36136C", "36136K", "36155V", "36175X", "36192J", "36197Q", "36197U", 
"36204U", "36237T", "36237W", "36246R", "36246U", "36249U", "36266L", 
"36267H", "36286E", "36296K", "410969", "41186R", "411924", "411927", 
"41197P", "41201P", "41203K", "41203P", "41221D", "41221V", "412262", 
"412460", "412462", "412464", "41246U", "412647", "412710", "412712", 
"41271T", "41272K", "41279H", "41293V", "413018", "413299", "41330C", 
"413324", "41351H", "41357V", "41361N", "41382Q", "41385H", "41403N", 
"414110", "414116", "414118", "41431J", "414352", "41442V", "41442X", 
"414709", "41481M", "41481R", "41481U", "41497H", "415066", "41507F", 
"41507M", "41518W", "41528R", "41528V", "41639R", "50009X", "50010D", 
"50131F", "50147K", "50263K", "50277N", "50277R", "50291T", "50310R", 
"50315N", "50315Q", "50322L", "50343Q", "50367F", "50367M", "50367P", 
"50385U", "50420Q", "50420T", "50440R", "504440", "504458", "504531", 
"504634", "504654", "504656", "504663", "504667", "504712", "504866", 
"505048", "505049", "505050", "505070", "50507N", "50507P", "505087", 
"505090", "50514Q", "505241", "505346", "505368", "505385", "505459", 
"505463", "505480", "505509", "505572", "505639", "505656", "50575H", 
"50575J", "505843", "505973", "50625F", "50634D", "50634F", "50697L", 
"50697N", "50698Q", "50704T", "50760Q", "507664", "507726", "50781W", 
"50788W", "50820E", "50828F", "50888T", "50929D", "50935U", "51033J", 
"51066H", "51086W", "51163N", "51164L", "51168F", "51174K", "51196F", 
"51227R", "51234R", "51238Q", "51265X", "51298F", "51299R", "51299U", 
"51305C", "51346H", "51406N", "51452K", "51452U", "51579X", "51804X", 
"51927K", "51936U", "51968W", "531883", "53415D", "53534D", "53545E", 
"53588M", "53614P", "53651F", "53720E", "539623", "539841", "539873", 
"540193", "54057T", "54072N", "54124K", "54133X", "54143U", "54164D", 
"54175W", "54334L", "54450P", "54468X", "670386", "670387", "670390", 
"670394", "670409", "670535", "671152", "671232", "671262", "671264", 
"671294", "671469", "671475", "671550", "674731", "674733", "675230", 
"67612N", "676138", "676296", "676450", "676593", "67663T", "676648", 
"676756", "676768", "676770", "676774", "676804", "679114", "679205", 
"679384", "679386", "679411", "67941K", "679458", "679581", "679684", 
"679687", "679732", "679821", "68073E", "681070", "681179", "681309", 
"681441", "681668", "681674", "681771", "681772", "681773", "681874", 
"681876", "681945", "681983", "68270J", "68330Q", "684942", "684967", 
"684982", "68535U", "68572U", "686002", "686087", "686088", "686119", 
"686235", "686274", "686275", "686276", "68636X", "686654", "686792", 
"686871", "686872", "686874", "686946", "686947", "68703V", "687385", 
"68780X", "687848", "687958", "688024", "688025", "688026", "688137", 
"688158", "688190", "688282", "688312", "688553", "688622", "688646", 
"688700", "688731", "688733", "688751", "688856", "688877", "688955", 
"688957", "69000P", "69000T", "690040", "690041", "690166", "690168", 
"69026L", "69026N", "690326", "690415", "690792", "690825", "690976", 
"69150T", "69262V", "69297L", "69484Q", "69505M", "695098", "695099", 
"695101", "695102", "695251", "695328", "695379", "695383", "695478", 
"695480", "695482", "695484", "695485", "695615", "695670", "695671", 
"695672", "695790", "695792", "695793", "695794", "695996", "69695F", 
"697063", "697098", "697105", "697126", "697269", "697334", "697457", 
"697458", "697459", "69746D", "697528", "697530", "697532", "697534", 
"697712", "697714", "697835", "697970", "697976", "697979", "697998", 
"698000", "698008", "698016", "698018", "698163", "698267", "698269", 
"698271", "698273", "698445", "698447", "698449", "698473", "698501", 
"698675", "698738", "698775", "698796", "698798", "698822", "698853", 
"698855", "698857", "698872", "69892Q", "698940", "698943", "698975", 
"698992", "698994", "698996", "698998", "69900U", "69913H", "7001NE", 
"700409", "7019JR", "702300", "702699", "702812", "71973L", "72464R", 
"72464U", "72483F", "72568X", "729108", "729175", "729244", "729304", 
"72931E", "729376", "729407", "729532", "729536", "72958C", "729717", 
"72981J", "729951", "729956", "729998", "74032R", "74042L", "74053J", 
"741302", "741413", "741639", "741676", "741846", "741915", "741916", 
"745070", "7450TR", "74513K", "74653D", "7465F5", "749786", "755072", 
"755075", "755076", "755380", "755415", "755530", "755589", "755661", 
"755671", "755724", "756342", "756395", "756463", "756507", "756550", 
"756551", "756648", "75678H", "756801", "756841", "75688C", "75688E", 
"77123D", "77265W", "772756", "772785", "772836", "77287U", "77287W", 
"77338T", "7734G7", "77414X", "775004", "775005", "775006", "775008", 
"775010", "775011", "775012", "775013", "775014", "775017", "775018", 
"775019", "775027", "775028", "775030", "775031", "775032", "775033", 
"775034", "775038", "775039", "775042", "775045", "775047", "775048", 
"775049", "775050", "775054", "775055", "775056", "775058", "775059", 
"775060", "775061", "775063", "775065", "775066", "775067", "775073", 
"775075", "775076", "775077", "775079", "775080", "775081", "775082", 
"775083", "775084", "775087", "775088", "775090", "775091", "775092", 
"775093", "775096", "775097", "775099", "775100", "775101", "775103", 
"775104", "775108", "775109", "775110", "775112", "775114", "775118", 
"775119", "775121", "775123", "775125", "775126", "775127", "775129", 
"775130", "775134", "775135", "775136", "775137", "775140", "775143", 
"775144", "775145", "775148", "775149", "775150", "775151", "775152", 
"775153", "775155", "775156", "775157", "775158", "775159", "775160", 
"775161", "775164", "775165", "775166", "775169", "775170", "775171", 
"775172", "775174", "775176", "775178", "775182", "775183", "775184", 
"775185", "775188", "775189", "775195", "775198", "775200", "775201", 
"775205", "775206", "775207", "775208", "775212", "775213", "775215", 
"775216", "77541C", "775543", "775607", "775647", "775650", "775665", 
"775668", "775671", "775672", "775692", "775697", "775700", "775725", 
"775744", "775766", "775787", "775824", "775828", "775850", "775863", 
"775866", "775869", "775875", "779095", "779096", "779393", "865236", 
"86529X", "8653LJ", "8655QU", "866013", "866015", "86605R", "866071", 
"8660QZ", "866132", "86624J", "8663YK", "866649", "866802", "866806", 
"866807", "866814", "866815", "866816", "866822", "866827", "866833", 
"866835", "866858", "866859", "866860", "866863", "866864", "866865", 
"866867", "866869", "866870", "866871", "866872", "866873", "866875", 
"866877", "866879", "866881", "866884", "866885", "866887", "866890", 
"866891", "866892", "866893", "866894", "866895", "866897", "866900", 
"866901", "866902", "866903", "866904", "866905", "866906", "866907", 
"866909", "866910", "866911", "866913", "866916", "866917", "866918", 
"866919", "866920", "866921", "866922", "866923", "866924", "866925", 
"866926", "866928", "866930", "866931", "866932", "866933", "866934", 
"866935", "866936", "866937", "866940", "866942", "866943", "866946", 
"866947", "866950", "866951", "866953", "866954", "866955", "866956", 
"866957", "866960", "866961", "866962", "866964", "866965", "866966", 
"866968", "866969", "866970", "866971", "866972", "866973", "866974", 
"866975", "866978", "866979", "86780E", "8696U9", "8700H2", "8701KK", 
"8706KL", "87136T", "87151K", "87234V", "87279Q", "87310U", "87314V", 
"8735UU", "8736A3", "8752P5", "875876", "876246", "876251", "87677L", 
"87755D", "87772J", "87779F", "87809P", "8784CJ", "88045W", "881098", 
"88188Q", "882059", "882067", "882075", "882246", "882268", "882284", 
"882292", "882294", "882302", "882362", "882363", "882778", "8871WY", 
"888493", "888823", "888905", "888906", "8894H4", "8896F7", "8898MM", 
"8908A4", "8910Z1", "892381", "892568", "89275V", "89367H", "89368N", 
"896322", "896382", "896424", "896456", "896530", "896567", "896601", 
"896673", "896674", "896729", "897384", "897801", "898618", "898696", 
"898719", "898772", "898780", "899004", "899005", "899070", "899187", 
"902191", "902192", "902193", "9030YZ", "904881", "905009", "905071", 
"905243", "9055XU", "9058DE", "9063LK", "91099V", "91106A", "9110CP", 
"9110DH", "9111KD", "91131Q", "9113KN", "9113M4", "9113M7", "9120DC", 
"912318", "912337", "91240F", "912433", "912624", "912819", "912977", 
"916039", "916118", "916181", "916235", "916341", "9163ND", "9163ZM", 
"9166LC", "916710", "916776", "916825", "916970", "9170JT", "9171C2", 
"92103H", "9211R1", "9211R3", "921260", "921285", "921289", "92206E", 
"922399", "922819", "922888", "923117", "92318K", "923256", "923533", 
"923536", "923537", "923551", "923744", "923754", "9237G2", "923922", 
"92670W", "9268RU", "9270F3", "9270K3", "9271H6", "9274QU", "92760Y", 
"9278R4", "9288NU", "929015", "929016", "929017", "929018", "929019", 
"929020", "929021", "929022", "929024", "929025", "929028", "929029", 
"929030", "929031", "929032", "929033", "929035", "929040", "929041", 
"929042", "929044", "929046", "929047", "929048", "929049", "929050", 
"929051", "929052", "929053", "929054", "929055", "929057", "929058", 
"929059", "929060", "929062", "929063", "929066", "929067", "929070", 
"929073", "929075", "929077", "929078", "929080", "929083", "929097", 
"929098", "929099", "929100", "929101", "929106", "929114", "929116", 
"929117", "929118", "929119", "929121", "929123", "929124", "929125", 
"929126", "929128", "929129", "929130", "929131", "929133", "9292L9", 
"929541", "929542", "929560", "929918", "930095", "9301KQ", "930216", 
"930376", "930606", "9307AJ", "9308NW", "93125T", "9314FE", "933063", 
"933366", "933371", "933373", "9344KT", "9344ZA", "936292", "936326", 
"936473", "936474", "936476", "936477", "936479", "936480", "936481", 
"936482", "936499", "9364D1", "936539", "936540", "936870", "936871", 
"936905", "936906", "936907", "936908", "936909", "936910", "936912", 
"936913", "936914", "936915", "936931", "936934", "936935", "936936", 
"936938", "936939", "936940", "93730Z", "9373ZG", "9374XF", "937927", 
"938744", "944429", "944766", "944835", "944954", "945210", "945456", 
"945528", "945728", "945780", "945793", "946049", "946050", "946250", 
"946281", "9463X2", "946403", "9468LA", "9470PN", "950831", "950958", 
"950989", "951184", "951186", "951188", "951189", "951190", "951192", 
"951194", "951195", "951196", "951197", "951198", "951199", "951201", 
"951203", "951204", "951206", "951207", "951209", "951211", "951212", 
"951213", "951214", "951216", "951217", "951219", "951220", "951221", 
"951222", "951224", "951225", "951226", "951227", "951228", "951229", 
"951230", "951231", "951232", "951233", "951234", "951235", "951347", 
"951476", "951477", "951478", "951487", "951491", "951493", "951496", 
"951632", "951636", "951639", "951640", "951642", "951643", "951651", 
"951657", "951659", "951660", "951661", "951663", "951678", "951679", 
"951680", "951683", "951686", "951691", "951737", "951738", "951741", 
"951747", "951750", "951752", "951755", "951759", "951772", "951774", 
"951776", "951778", "952089", "952255", "952263", "952264", "952266", 
"952267", "952272", "952277", "952279", "952280", "952281", "952283", 
"952284", "952285", "952299", "9532DJ", "9557N4", "97498V", "981853", 
"9826H9", "982910", "992562", "9928GV", "997704", "998222", "999503", 
"999564", "999661"), class = "factor"), WC06001 = c("7C SOLARPARKEN AG", 
"7C SOLARPARKEN AG", "7C SOLARPARKEN AG", "7C SOLARPARKEN AG", 
"7C SOLARPARKEN AG", "7C SOLARPARKEN AG"), WC07021 = c(4911, 
4911, 4911, 4911, 4911, 4911), WC07015 = structure(c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), WC02001 = c(18, 4225, 14290, 4736, 
2607, 32255), WC02003 = c(NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), WC02008 = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_), WC02149 = c(9, 540, 298, 449, 
819, 3655), WC02250 = c(NA, 207, 2, 2, 0, 15787), WC02201 = c(27, 
24391, 35837, 30144, 55952, 72650), WC02501 = c(0, 282, 706, 
583, 594, 159753), WC02301 = c(NA, 364, 893, 885, 1014, 169410
), WC02401 = c(NA, 82, 187, 302, 420, 9657), WC02652 = c(0, 19949, 
18999, 25200, 21977, 72322), WC02999 = c(27, 44829, 55544, 55929, 
78523, 320512), WC02654 = c(0, 19952, 18909, 19200, 15663, 73062
), WC02655 = c(0, 3, 17, 78, 190, 740), WC02300 = c(40, 44829, 
56874, 57705, 78523, 323110), WC03051 = c(NA, 846, 4297, 3298, 
10444, 18664), WC03101 = c(40, 8763, 14817, 11353, 39297, 57920
), WC03251 = c(0, 0, 9378, 9436, 0, 143607), WC03260 = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), WC03273 = c(0, 
472, 256, 30, 0, 394), WC03351 = c(40, 9235, 23152, 19505, 39297, 
202172), WC03401 = c(NA_real_, NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_), WC03426 = c(NA, NA, 0, 0, 0, 657), WC03451 = c(NA, 
NA, 0, 0, 0, 0), WC03501 = c(-13, 35594, 32392, 36424, 39226, 
117683), WC03999 = c(27, 44829, 55544, 55929, 78523, 320512), 
    WC01001 = c(0, 52582, 62208, 85370, 142755, 117178), WC01151 = c(47, 
    71, 207, 243, 286, 6097), WC01100 = c(-47, 6145, 3559, 7987, 
    21592, 21652), WC01250 = c(-116, 4322, -5951, -172, 11342, 
    15576), WC01266 = c(NA, 42, 155, 224, 494, 325), WC01262 = c(54, 
    18, 199, 381, -2358, 231), WC01251 = c(0, 106, 849, 532, 
    922, 10075), WC01401 = c(-62, 4146, -7150, -99, 8554, 8073
    ), WC01451 = c(NA, 1523, -2717, 177, 3586, 2336), WC01501 = c(NA, 
    NA, NA, NA, NA, -12), WC01201 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), WC18140 = c(NA, 214, 516, 
    576, 757, NA), WC18276 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), WC18275 = c(0, 130, 24, 0, 
    2, 41), WC18191 = c(-62, 4252, -6301, 433, 9476, 18148), 
    WC18198 = c(-15, 4323, -6094, 676, 9762, 24245), WC18155 = c(-69, 
    4393, -5744, 71, 11628, 21673), WC01268 = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), WC01352 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), WC18324 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), WC04001 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), WC04051 = c(NA, 
    69, 193, 182, 174, 5604), WC04151 = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), WC04201 = c(-35, 
    3693, -4304, -170, 7285, -2583), WC04831 = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), WC04860 = c(-25, 
    -8775, -3315, -12496, -1508, 28836), WC04890 = c(0, 13258, 
    14055, 3309, 3298, -3249), WC04797 = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), WC04870 = c(-3, 
    544, 675, 367, 339, 3380), WC04401 = c(NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), WC04821 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), WC04149 = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), WC04501 = c(NA, 
    12582, -14369, 9384, 5833, -24790), WC04601 = c(NA, 203, 
    675, 111, 343, 8220), WC04701 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), WC04551 = c(NA, NA, NA, 0, 
    0, 0), WC04148 = c(NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), WC04150 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), WC04851 = c(-22, 3939, 10065, 
    -9554, 1451, 22207), WC04500 = c(49, 32984, 10609, 4366, 
    -13873, 216410), WC04900 = c(NA, 15641, 5392, -2229, -2136, 
    -1925), WC04057 = c(NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_), WC04811 = c(NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), CURRENCY = c("E", "E", "E", 
    "E", "E", "E"), year = c(2004, 2005, 2006, 2007, 2008, 2009
    ), active = c(1, 1, 1, 1, 1, 1)), row.names = c("2004.1535", 
"2005.1535", "2006.1535", "2007.1535", "2008.1535", "2009.1535"), class = "data.frame")
  

Комментарии:

1. Ваш вывод dput неполон. Обязательно скопируйте все и вставьте.

2. Да, я пропустил последнюю строку. Теперь это полный результат.

Ответ №1:

Вот dplyr версия. Я отфильтровываю пропущенные данные value , чтобы получить чистое количество по идентификатору после group_by (должно быть не менее 5). Использование rle и diff для получения длин циклов и значений (количество циклов), которые должны быть длиной не менее 5 и существовать хотя бы один раз.

  data %>%
      filter(!is.na(value)) %>%
      group_by(id) %>%
      filter(
        n() >= 5 amp;
          any(rle(diff(year))$lengths >= 4 amp; rle(diff(year))$values >= 1)
      )
  

Комментарии:

1. Спасибо за пример. Я попытался запустить адаптированный код, но получил Error: (list) object cannot be coerced to type 'double' . Есть идеи, на что это указывает? id это символьная строка, но оба year и value являются цифрами, поэтому я немного запутался с сообщением об ошибке.

2. Это странно, я рассматриваю data$id как фактор. можете ли вы запустить его str(data) после создания data в чистой среде? Единственной зависимостью должна быть dplyr , вы также можете попробовать обновить этот пакет с помощью install.packages("dplyr") .

3. Я ошибся с типом в исходном наборе данных и изменил его соответствующим образом через as.factor . Выполнение кода теперь приводит к, Warning message: Factor 'fct_explicit_na(id, na_level = "(Missing)")' contains implicit NA, consider using 'forcats::fct_explicit_na' хотя нигде в NA столбце нет id s. Таким образом, проблема, по-видимому, в моих данных, хотя я не знаю, где именно.

4. Я бы убедился, что DSCD — это коэффициент, WC02999 — числовое значение, а year — целое число в вашем наборе данных. Также разделите ваши данные на эти переменные, чтобы изолировать проблему. Я подозреваю, что дополнительные столбцы в ваших данных приводят к тому, что ваши тестовые данные не воспроизводят проблему.

5. Ваше подозрение было верным. Как только я подстановил данные и изменил типы, ваш скрипт работал точно так, как он должен был работать в начале. Это, конечно, поставило передо мной задачу каким-то образом согласовать результаты с моими исходными данными. Для этого я решил использовать имена строк (созданные через tibble ‘s rownames_to_column ), добавив вторую dplyr операцию: original_data %>% filter(row_name %in% sample_data$row_name) . Это, наконец, вернуло результаты, на которые я надеялся. Вероятно, это громоздкое решение для опытных пользователей, но на данный момент оно помогает. Спасибо за вашу настойчивость!

Ответ №2:

Другое решение, использующее tapply() функцию из base R . Для каждого из них data$id внутри tapply() функции !is.na(data$value) создается логический вектор TRUE и FALSE и выполняется через function(x) . Внутри этой функции rle(x) подсчет количества каждого значения ( T , F ) выполняется без прерываний. например, T, T, T, F, F, F, T,T, T даст 3,2,2, что означает, что T встречается 3 раза подряд, затем F дважды, за которым дважды следует T. Из этих подсчетов нас интересуют только подсчеты, TRUE которые представляют не NA значения в ваших данных, что обеспечивается rle(x)$values==T частью функции. Наконец, генерируется и прогоняется вектор, max.rle содержащий количество длин TRUE ifelse() , который оценивает, равна ли длина max.rle > 0, затем возвращает max() значение вектора, в противном случае возвращает ноль. Это условие необходимо, потому что если у вас есть запись со всеми NA, то она выдаст результат, -Inf и эта ifelse команда обрабатывает это.

 # order dataframe on id and year
data <- data[order(data$id, data$year), ]
# get the max length of non-NA stretche in values column
max.rle <- tapply(!is.na(data$value), data$id, function(x) {
  max.vec <- rle(x)$length[rle(x)$values==T]
  ifelse(length(max.vec) > 0, max(max.vec), 0)
})
# remove those ids that has stretch length less than 5
data <- data[data$id %in% names(max.rle[max.rle >= 5]), ]
# print data
data

   id year     value
1   A 2008 116.57251
2   A 2009  92.22958
3   A 2010  68.67486
4   A 2011  86.67054
5   A 2012  85.74104
6   A 2013  83.21088
7   A 2014  97.20029
8   A 2015 127.53420
9   A 2016  86.97861
10  A 2017 119.10791
11  B 2008 105.26708
12  B 2009  72.47399
13  B 2010  85.00305
14  B 2011  93.80867
15  B 2012 113.37334
16  B 2013 116.63578
17  B 2014 119.41421
18  B 2015 108.64411
19  B 2016  73.80403
20  B 2017 143.75300
  

Комментарии:

1. Спасибо, например. Не могли бы вы любезно объяснить, что делает function (x) in tapply ? Я пытался адаптировать код, но получил бесчисленное количество предупреждений (например, In max(rle(x)$length[rle(x)$value == T]) : no non-missing arguments to max; returning -Inf ). Таким образом, результирующий max.rle вектор заполнен Inf символами и не сильно помогает для следующего шага.

2. Я добавил полное описание и изменил tapply для обработки ошибок / предупреждений, которые вы получали. Ваше предупреждение происходит, вероятно, потому, что у вас есть идентификатор, в котором были все NA. Но фиксированная функция должна это обрабатывать.

3. Большое вам спасибо за подробное объяснение. Тем не менее, я проверил все свои id файлы ( sum(is.na(DEU_active$DSCD)) возвращенные [1] 0 ), и, похоже, ни с одним из них проблем нет. Запуск адаптированного кода теперь приводит к получению max.rle вектора, полного 0 единиц, хотя я ясно вижу вручную, что многие id единицы удовлетворяют критерию > = 5 year секунд. Есть ли какие-либо четкие указания на то, что может быть не так с фактическими данными, если это не связано с кодом?

4. Можете ли вы попробовать, работает ли это с данными здесь, в вашем первоначальном вопросе? В (sum(is.na(DEU_active$DSCD)) является ли DSCD столбцом идентификатора или значения? Можете ли вы поделиться dput (head (данными)) ваших реальных данных?

5. Приносим извинения за ошибку копирования-вставки. DSCD равно id . Смотрите исходное сообщение для обзора реальных данных.

Ответ №3:

Второе условие, похоже, также учитывает первое. Вычислите разницу между годами для каждой группы и посмотрите, есть ли по крайней мере четыре 1

 d = data[!is.na(data$value),]

d[ave(d$year, d$id, FUN = function(x){
    delta = diff(sort(x))
    if ( with(rle(delta), max(lengths[values == 1])) >=4 ){
        rep(TRUE, length(x))
    }else {
        rep(FALSE, length(x))
    }
}) == 1,]
#   id year     value
#1   A 2008 127.41917
#2   A 2009  88.70604
#3   A 2010 107.26257
#4   A 2011 112.65725
#5   A 2012 108.08537
#6   A 2013  97.87751
#7   A 2014 130.23044
#8   A 2015  98.10682
#9   A 2016 140.36847
#10  A 2017  98.74572
#11  B 2008 126.09739
#12  B 2009 145.73291
#13  B 2010  72.22279
#14  B 2011  94.42422
#15  B 2012  97.33357
#16  B 2013 112.71901
#17  B 2014  94.31494
#18  B 2015  46.87089
#19  B 2016  51.19066
#20  B 2017 126.40227
  

 #DATA
    set.seed(42)
    data <- data.frame(id = c(rep("A", 10),
                              rep("B", 10),
                              rep("C", 10),
                              rep("D", 10)),
                       year = rep(2008:2017, 4),
                       value = c(rnorm(10, mean = 100, sd = 20),
                                 rnorm(10, mean = 100, sd = 20),
                                 rnorm(4, mean = 100, sd = 20),
                                 rep(NA, 2),
                                 rnorm(4, mean = 100, sd = 20),
                                 rnorm(2, mean = 100, sd = 20),
                                 rep(NA, 8)))