කණ්ඩායම්කරණ කාර්යයන් (තට්ටු කරන්න, අනුව, සමස්ත) සහ * අදාළ පවුල


1050

R හි "සිතියම්" පයි යමක් කිරීමට මට අවශ්‍ය වූ විට, මම සාමාන්‍යයෙන් applyපවුල තුළ ශ්‍රිතයක් භාවිතා කිරීමට උත්සාහ කරමි .

කෙසේ {- කෙසේ වෙතත්, මම තරමක් ඔවුන් අතර ඇති වෙනස්කම් තේරුම් කවදාවත් sapply, lapplyමම බොහෝ විට එසේ - ප්රතිදාන වගේ දේ ඇත, හෝ ආදානය කළ හැකි දේ පවා, ආදාන / වර්ගීකරණය කරනු ආදාන උත්සවයට අදාළ, ආදිය} මට අවශ්‍ය දේ ලැබෙන තුරු ඒ සියල්ල හරහා යන්න.

කවදාද එය භාවිතා කරන්නේ කෙසේදැයි යමෙකුට පැහැදිලි කළ හැකිද?

මගේ වර්තමාන (බොහෝ විට වැරදි / අසම්පූර්ණ) අවබෝධය නම් ...

  1. sapply(vec, f): ආදානය දෛශිකයකි. ප්රතිදානය අංගයක් එහිදී දෛශික / න්යාසය, ය iවන්නේ f(vec[i])නම් ඔබ න්යාසය ලබා දීම, fබහු-අංගයක් ප්රතිදානය ඇත

  2. lapply(vec, f): සමාන sapply, නමුත් ප්‍රතිදානය ලැයිස්තුවක් ද?

  3. apply(matrix, 1/2, f): ආදානය යනු අනුකෘතියකි. ප්‍රතිදානය දෛශිකයකි, මෙහි මූලද්‍රව්‍යය if (පේළිය / col i න්‍යාසයේ)
  4. tapply(vector, grouping, f): ප්‍රතිදානය යනු අනුකෘතිය / අරාවකි, එහිදී න්‍යාසය / අරාවෙහි මූලද්‍රව්‍යයක් දෛශිකයේ fකාණ්ඩගත කිරීමේ අගය වන අතර එය පේළියට / තීරුවලට තල්ලු වේ.gg
  5. by(dataframe, grouping, f): gකණ්ඩායම් වීමට ඉඩ දෙන්න . fකණ්ඩායමේ / දත්ත රාමුවේ එක් එක් තීරුවට අදාළ වේ. fඑක් එක් තීරුවේ සමූහකරණය සහ එහි වටිනාකම මුද්‍රණය කරන්න .
  6. aggregate(matrix, grouping, f): සමාන by, නමුත් ප්‍රතිදානය ලස්සන ලෙස මුද්‍රණය කරනවා වෙනුවට, සමස්තය දත්ත රාමුවකට ඇලවීම.

පැත්තේ ප්රශ්නය: මම තවමත් plyr හෝ අතිරික්ත මේදය, උගත් නැහැ - බව plyrහෝ reshapeමුළුමනින්ම ඒ සියලු වෙනුවට?


33
ඔබේ පැත්තේ ප්රශ්නය: බොහෝ දේ plyr සඳහා සඳහා සෘජු ආදේශනය යනු *apply()හා by. ප්ලයර් (අවම වශයෙන් මට) වඩා ස්ථාවර බවක් පෙනේ, එය අපේක්ෂා කරන දත්ත ආකෘතිය කුමක්ද සහ එය කෙළ ගසන්නේ කුමක් දැයි මම සැමවිටම දනිමි. ඒකෙන් මට ගොඩක් කරදර වෙනවා.
ජේ ඩී ලෝන්ග්

12
තවද, එකතු කිරීම නිර්දේශ කරමි: doByසහ තෝරා ගැනීමේ සහ අදාළ කිරීමේ හැකියාවන් data.table.
අයිටරේටර්

7
sapplyනිමැවුමේ lapplyඑකතු කිරීම සමඟ පමණි simplify2array. applyපරමාණුක දෛශිකයට බල කරයි, නමුත් ප්‍රතිදානය දෛශික හෝ ලැයිස්තුව විය හැකිය. byදත්ත රාමු උප දත්ත රාමු වලට බෙදන නමුත් එය fතීරු මත වෙන වෙනම භාවිතා නොකරයි . 'Data.frame'- පන්තිය සඳහා ක්‍රමවේදයක් තිබේ නම් පමණක් fතීරු අනුව අයදුම් කළ byහැකිය. aggregateපළමු තර්කයේ විවිධ පංති සඳහා විවිධ ක්‍රම පවතී.
IRTFM

8
සිහිවටන: l යනු 'ලැයිස්තුව' සඳහා ය, s යනු 'සරල කිරීම' සඳහා ය, t යනු 'එක් වර්ගයකට' (කාණ්ඩයේ සෑම
මට්ටමක්ම

Rfast පැකේජයේ සමහර කාර්යයන් ද ඇත, එනම්: eachcol.apply, apply.condition, සහ තවත් බොහෝ දේ R ට සමාන වේ
Stefanos

Answers:


1338

උපකාරක ලිපිගොනු වල (උදා ?apply) විස්තර කර ඇති R * බොහෝ * යෙදුම් කාර්යයන් ඇත. ඒවායින් සෑහෙන ප්‍රමාණයක් ඇතත්, ආරම්භක භාවිතය සඳහා ඔවුන්ගේ තත්වයට සුදුසු වන්නේ කුමක්ද යන්න තීරණය කිරීමට හෝ ඒවා සියල්ලම මතක තබා ගැනීමට පවා අපහසු විය හැකිය. "මම මෙහි * අයදුම් කිරීමේ ශ්‍රිතයක් භාවිතා කළ යුතුය" යන සාමාන්‍ය හැඟීම ඔවුන්ට තිබිය හැකි නමුත් මුලදී ඒවා සියල්ලම කෙළින් තබා ගැනීම දුෂ්කර විය හැකිය.

* අයදුම් කරන පවුලේ බොහෝ ක්‍රියාකාරකම් අතිශයින් ජනප්‍රිය plyrපැකේජයකින් ආවරණය වී ඇති බව (වෙනත් පිළිතුරු වල සටහන් කර ඇත) , මූලික කාර්යයන් ප්‍රයෝජනවත් වන අතර දැන ගැනීම වටී.

මේ පිළිතුර කිසියම් ආකාරයක ලෙස ක්රියා කිරීමට අදහස් කර ගෙන ඇත කළාත්මක නිවැරදි * තම විශේෂ ප්රශ්නය පැනනගී අයදුම් කිරීමට ඔවුන් යොමු උදව් නව පරිශීලකයන් සඳහා. සටහන, මේ වන නොවේ හුදෙක් අභ්යාස කිරීම රිසි හෝ ආර් ප්රලේඛනය වෙනුවට! බලාපොරොත්තුව නම්, මෙම පිළිතුර ඔබේ තත්වයට ගැලපෙන * අදාළ වන ශ්‍රිතය තීරණය කිරීමට ඔබට උපකාරී වන අතර පසුව එය තවදුරටත් පර්යේෂණ කිරීම ඔබ සතු ය. එක් ව්‍යතිරේකයක් සමඟ, කාර්ය සාධන වෙනස්කම් විසඳනු නොලැබේ.

  • අයදුම් කරන්න - ඔබට අනුකෘතියක පේළි හෝ තීරුවලට ශ්‍රිතයක් යෙදීමට අවශ්‍ය වූ විට (සහ ඉහළ මානයන්හි ප්‍රතිසම); දත්ත රාමු සඳහා සාමාන්‍යයෙන් සුදුසු නොවේ, මන්ද එය පළමුව අනුකෘතියකට බල කෙරෙනු ඇත.

    # Two dimensional matrix
    M <- matrix(seq(1,16), 4, 4)
    
    # apply min to rows
    apply(M, 1, min)
    [1] 1 2 3 4
    
    # apply max to columns
    apply(M, 2, max)
    [1]  4  8 12 16
    
    # 3 dimensional array
    M <- array( seq(32), dim = c(4,4,2))
    
    # Apply sum across each M[*, , ] - i.e Sum across 2nd and 3rd dimension
    apply(M, 1, sum)
    # Result is one-dimensional
    [1] 120 128 136 144
    
    # Apply sum across each M[*, *, ] - i.e Sum across 3rd dimension
    apply(M, c(1,2), sum)
    # Result is two-dimensional
         [,1] [,2] [,3] [,4]
    [1,]   18   26   34   42
    [2,]   20   28   36   44
    [3,]   22   30   38   46
    [4,]   24   32   40   48

    ඔබට 2D න්‍යාසයක් සඳහා පේළි / තීරු මාධ්‍යයන් හෝ මුදල් ප්‍රමාණයක් අවශ්‍ය නම්, ඉහළ ප්‍රශස්තිකරණය කළ, අකුණු සැර ඉක්මන් colMeans, rowMeans. colSums, විමර්ශනය කිරීමට වග බලා ගන්න rowSums.

  • lapply - ඔබට ලැයිස්තුවේ සෑම අංගයක් සඳහාම ශ්‍රිතයක් යෙදීමට අවශ්‍ය වූ විට ලැයිස්තුවක් ආපසු ලබා ගන්න.

    මෙය වෙනත් බොහෝ * අදාළ ශ්‍රිතයන්ගේ වැඩමුළුවයි. ඔවුන්ගේ කේතය නැවත පීල් කරන්න, එවිට ඔබට බොහෝ විට lapplyයටින් පෙනෙනු ඇත .

    x <- list(a = 1, b = 1:3, c = 10:100) 
    lapply(x, FUN = length) 
    $a 
    [1] 1
    $b 
    [1] 3
    $c 
    [1] 91
    lapply(x, FUN = sum) 
    $a 
    [1] 1
    $b 
    [1] 6
    $c 
    [1] 5005
  • sapply - ඔබට ලැයිස්තුවේ සෑම අංගයක් සඳහාම ශ්‍රිතයක් යෙදීමට අවශ්‍ය වූ විට, නමුත් ඔබට අවශ්‍ය වන්නේ ලැයිස්තුවකට වඩා දෛශිකයක් ආපසු ලබා ගැනීමයි.

    ඔබ යතුරු ලියනය කරන්නේ නම් unlist(lapply(...)), නතර කර සලකා බලන්න sapply.

    x <- list(a = 1, b = 1:3, c = 10:100)
    # Compare with above; a named vector, not a list 
    sapply(x, FUN = length)  
    a  b  c   
    1  3 91
    
    sapply(x, FUN = sum)   
    a    b    c    
    1    6 5005 

    වඩාත් දියුණු භාවිතයන්හි දී sapply, සුදුසු නම්, ප්‍රති result ලය බහු-මාන අරාවකට බල කිරීමට උත්සාහ කරනු ඇත. උදාහරණයක් ලෙස, අපගේ ශ්‍රිතය එකම දිගකින් යුත් දෛශික නැවත ලබා දෙන්නේ නම්, sapplyඒවා අනුකෘතියේ තීරු ලෙස භාවිතා කරයි:

    sapply(1:5,function(x) rnorm(3,x))

    අපගේ ශ්‍රිතය ද්විමාන අනුකෘතියක් sapplyලබා දෙන්නේ නම්, අවශ්‍යයෙන්ම එකම දේ කරයි, ආපසු එන සෑම අනුකෘතියක්ම තනි දිගු දෛශිකයක් ලෙස සලකයි:

    sapply(1:5,function(x) matrix(x,2,2))

    අප විසින් නිශ්චිතව දක්වා නොමැති නම් simplify = "array", එය බහු-මාන අරාවක් තැනීම සඳහා තනි මෙට්‍රික්ස් භාවිතා කරන්නේ කුමන අවස්ථාවෙහිදීද:

    sapply(1:5,function(x) matrix(x,2,2), simplify = "array")

    මෙම සෑම හැසිරීමක්ම ඇත්ත වශයෙන්ම අපගේ ශ්‍රිතය ආපසු ලබා දෙන දෛශික හෝ එකම දිග හෝ මානයන්හි න්‍යාසයන් මත අඛණ්ඩව පවතී.

  • vapply - ඔබට භාවිතා කිරීමට අවශ්‍ය sapplyනමුත් සමහර විට ඔබේ කේතයෙන් තවත් වේගයක් මිරිකා ගත යුතුය.

    මක්නිසාද යත් vapply, ඔබ මූලික වශයෙන් R ට ඔබේ ශ්‍රිතය නැවත පැමිණෙන්නේ කුමන ආකාරයේ දෙයකටද යන්න පිළිබඳ උදාහරණයක් ලබා දෙන අතර එමඟින් එක් පරමාණුක දෛශිකයකට ගැලපෙන පරිදි ආපසු හරවන ලද අගයන් බල කිරීම සඳහා යම් කාලයක් ඉතිරි කර ගත හැකිය.

    x <- list(a = 1, b = 1:3, c = 10:100)
    #Note that since the advantage here is mainly speed, this
    # example is only for illustration. We're telling R that
    # everything returned by length() should be an integer of 
    # length 1. 
    vapply(x, FUN = length, FUN.VALUE = 0L) 
    a  b  c  
    1  3 91
  • mapply - ඔබට දත්ත ව්‍යුහයන් කිහිපයක් ඇති විට (උදා: දෛශික, ලැයිස්තු) ඔබට එක් එක් මූලද්‍රව්‍යයන්ට ශ්‍රිතයක් යෙදීමට අවශ්‍ය වන අතර, පසුව එක් එක් 2 වන මූලද්‍රව්‍ය ආදිය. ප්‍රති result ලය දෛශික / අරාවකට බල කරන විට sapply.

    ඔබේ ශ්‍රිතය බහුවිධ තර්ක පිළිගත යුතුය යන අර්ථයෙන් මෙය බහුකාර්ය වේ.

    #Sums the 1st elements, the 2nd elements, etc. 
    mapply(sum, 1:5, 1:5, 1:5) 
    [1]  3  6  9 12 15
    #To do rep(1,4), rep(2,3), etc.
    mapply(rep, 1:4, 4:1)   
    [[1]]
    [1] 1 1 1 1
    
    [[2]]
    [1] 2 2 2
    
    [[3]]
    [1] 3 3
    
    [[4]]
    [1] 4
  • සිතියම - සමඟ එතීම , එබැවින් ලැයිස්තුවක් ආපසු ලබා දීම සහතික කෙරේ.mapplySIMPLIFY = FALSE

    Map(sum, 1:5, 1:5, 1:5)
    [[1]]
    [1] 3
    
    [[2]]
    [1] 6
    
    [[3]]
    [1] 9
    
    [[4]]
    [1] 12
    
    [[5]]
    [1] 15
  • rapply - මක්නිසාද යත්, කැදැලි ලැයිස්තු ව්‍යුහයක එක් එක් මූලද්‍රව්‍යයට පුනරාවර්තනයක් ලෙස ශ්‍රිතයක් යෙදීමට ඔබට අවශ්‍ය වූ විට ය .

    කෙතරම් අසාමාන්‍යද යන්න පිළිබඳව ඔබට යම් අදහසක් ලබා දීමට rapply, මෙම පිළිතුර පළ කරන විට මට එය අමතක විය! නිසැකවම, බොහෝ අය එය භාවිතා කරන බව මට විශ්වාසයි, නමුත් YMMV. rapplyඅයදුම් කිරීමට පරිශීලක අර්ථ දක්වන ලද ශ්‍රිතයක් සමඟ වඩාත් හොඳින් නිරූපණය කෙරේ:

    # Append ! to string, otherwise increment
    myFun <- function(x){
        if(is.character(x)){
          return(paste(x,"!",sep=""))
        }
        else{
          return(x + 1)
        }
    }
    
    #A nested list structure
    l <- list(a = list(a1 = "Boo", b1 = 2, c1 = "Eeek"), 
              b = 3, c = "Yikes", 
              d = list(a2 = 1, b2 = list(a3 = "Hey", b3 = 5)))
    
    
    # Result is named vector, coerced to character          
    rapply(l, myFun)
    
    # Result is a nested list like l, with values altered
    rapply(l, myFun, how="replace")
  • tapply - ඔබට දෛශිකයක උප කුලක සඳහා ශ්‍රිතයක් යෙදීමට අවශ්‍ය වූ විට සහ උප කුලක වෙනත් දෛශිකයක් මගින් අර්ථ දක්වා ඇති අතර එය සාමාන්‍යයෙන් සාධකයකි.

    * කළු බැටළුවන් * පවුලේ අය, විවිධාකාරයෙන්. උදව් ගොනුව "නවක වදය" යන වාක්‍ය ඛණ්ඩය භාවිතා කිරීම තරමක් ව්‍යාකූල විය හැකි නමුත් එය ඇත්ත වශයෙන්ම තරමක් සරල ය.

    දෛශිකයක්:

    x <- 1:20

    කණ්ඩායම් නිර්වචනය කරන සාධකය (එකම දිගකින්!):

    y <- factor(rep(letters[1:5], each = 4))

    xඅර්ථ දක්වා ඇති එක් එක් උප සමූහය තුළ අගයන් එකතු කරන්න y:

    tapply(x, y, sum)  
     a  b  c  d  e  
    10 26 42 58 74 

    සාධක කිහිපයක ලැයිස්තුවක අද්විතීය සංයෝජනයන් මගින් උප සමූහයන් අර්ථ දක්වා ඇති තැන වඩාත් සංකීර්ණ උදාහරණ හැසිරවිය හැකිය. tapplyහා R (පොදු බව භේදය-අයදුම්-ඒකාබද්ධ කටයුතු කිරීමට ආත්මය සමාන වේ aggregate, by, ave, ddply, ආදී) ඒ නිසා එහි කළු බැටළුවන් තත්වය.


32
ඔබ බව ඔබට පෙනී යනු ඇත විශ්වාස byපිරිසිදු භේදය-lapply වන අතර aggregateවේ tapplyඔවුන්ගේ මධ්යය දී. මම හිතන්නේ කළු බැටළුවන් විශිෂ්ට රෙදි සාදයි.
IRTFM

21
අපූරු ප්‍රතිචාරය! මෙය නිල R ලේඛනයේ කොටසක් විය යුතුය :). ඉතා කුඩා යෝජනාව: සමහර විට භාවිතා මත යම් උණ්ඩ එකතු aggregateසහ byමෙන්ම? (මම අවසානයේ ඔවුන් ඔබේ විස්තරය පසු, එය වෙන් කර, එම කාර්යයන් දෙකක් සඳහා යම් යම් විශේෂිත උදාහරණ ඇති ප්රයෝජනවත් විය හැකිය එසේ තේරුම් !, නමුත් ඔවුන් කරන්නේ ඉතා සාමාන්ය.)
grautur

3
(අ) දිගු වීම සහ (ආ) ප්‍රලේඛනය නැවත ලිවීම වළක්වා ගැනීම සඳහා මම මෙම පිළිතුරෙන් ක්‍රියාශීලීව කප්පාදු කළෙමි. යනාදිය පදනම් වන්නේ * අදාළ කිරීමේ කාර්යයන් මත වන අතර aggregate, byඒවා භාවිතා කිරීමට ඔබ ප්‍රවේශ වන ආකාරය පරිශීලකයන්ගේ දෘෂ්ටිකෝණයට වඩා වෙනස් වන අතර ඒවා වෙනම පිළිතුරකින් සාරාංශ කළ යුතුය. මට වෙලාවක් තිබේ නම් හෝ වෙනත් අයෙකු මට පහර දී මගේ ඉහළ ආදායම උපයා ගැනීමට උත්සාහ කළ හැකිය.
joran

4
ද, ?Mapඥාතියෙකු ලෙසmapply
බැප්ටිස්ට්

3
sjsanders - මම කිසිසේත් එයට එකඟ නොවෙමි. data.frames යනු R හි නිරපේක්ෂ කේන්ද්‍රීය කොටසක් වන අතර විශේෂයෙන් listවස්තුවක් නිතර භාවිතා කරනු ලැබේ lapply. සාම්ප්‍රදායික සෘජුකෝණාස්රාකාර දත්ත කට්ටලයක බොහෝ වර්ගවල දෛශික / සාධක කාණ්ඩගත කිරීම සඳහා ඒවා බහාලුම් ලෙස ක්‍රියා කරයි. අතර data.tableහා plyrඇතැම් වඩාත් සුව පහසු විය හැකි කාරක රීති යම් වර්ගය එකතු විය හැකි, ඔවුන් දීර්ඝ හා කටයුතු කරන data.frameපිළිවෙළින් s.
thelatemail

192

පැත්තේ සටහනේ, විවිධ plyrකාර්යයන් මූලික *applyශ්‍රිතයන්ට අනුරූප වන ආකාරය මෙන්න (හඳුන්වාදීමේ සිට ප්ලයිර් ලේඛනය ප්ලයිර් වෙබ් පිටුවෙන් http://had.co.nz/plyr/ )

Base function   Input   Output   plyr function 
---------------------------------------
aggregate        d       d       ddply + colwise 
apply            a       a/l     aaply / alply 
by               d       l       dlply 
lapply           l       l       llply  
mapply           a       a/l     maply / mlply 
replicate        r       a/l     raply / rlply 
sapply           l       a       laply 

එක් පරමාර්ථයක් plyrවන්නේ එක් එක් කාර්යයන් සඳහා ස්ථාවර නම් කිරීමේ සම්මුතීන් සැපයීම, ශ්‍රිත නාමයේ ආදාන සහ ප්‍රතිදාන දත්ත වර්ග කේතනය කිරීමයි. එය නිමැවුමේ අනුකූලතාවක් ද සපයයි, එම ප්‍රතිදානයෙන් ප්‍රයෝජනවත් නිමැවුම් නිපදවීම සඳහා dlply()පහසුවෙන් ගමන් කළ ldply()හැකිය.

සංකල්පමය වශයෙන්, plyrමූලික *applyකාර්යයන් තේරුම් ගැනීමට වඩා ඉගෙනීම දුෂ්කර නොවේ .

plyrසහ reshapeකාර්යයන් මගේ එදිනෙදා භාවිතයේදී මෙම කාර්යයන් සියල්ලම පාහේ ප්‍රතිස්ථාපනය කර ඇත. නමුත්, හැඳින්වීමේ සිට ප්ලයර් ලේඛනය දක්වා:

ආශ්‍රිත ශ්‍රිත tapplyසහ sweepඒවාට අනුරූප ශ්‍රිතයක් නොමැති අතර plyrඒවා ප්‍රයෝජනවත් වේ. mergeමුල් දත්ත සමඟ සාරාංශ ඒකාබද්ධ කිරීම සඳහා ප්‍රයෝජනවත් වේ.


13
මම මුල සිටම R ඉගෙන ගැනීමට පටන් ගත් විට, *apply()පවුලේ කාර්යයන්ට වඩා ප්ලයිර් ඉගෙන ගැනීමට පහසු බව මට පෙනී ගියේය . මට නම්, ddply()මම SQL ඒකරාශි කාර්යයන් හුරු පුරුදු විය ලෙස ඉතා ඉවෙන් විය. ddply()බොහෝ ගැටලු විසඳීම සඳහා මගේ මිටියක් බවට පත් වූ අතර සමහර ඒවා වෙනත් විධානයන් සමඟ වඩා හොඳින් විසඳා ගත හැකිය.
ජේ ඩී ලෝන්ග්

1
plyrකාර්යයන් පිටුපස ඇති සංකල්පය ශ්‍රිතවලට සමාන බව මම අනුමාන කළෙමි *apply, එබැවින් ඔබට එකක් කළ හැකි නම්, ඔබට අනෙක් දේ කළ හැකිය, නමුත් plyrකාර්යයන් මතක තබා ගැනීම පහසුය. නමුත් මම මිටියට සම්පූර්ණයෙන්ම එකඟ වෙමි ddply()!
ජොෆ්රොව්ල්ඩ්

1
join()ඒකාබද්ධ කිරීමට සමාන කාර්යයන් ඉටු කරන ශ්‍රිතය ප්ලයිර් පැකේජයට ඇත . සමහර විට එය ප්ලයිර් සන්දර්භය තුළ සඳහන් කිරීම වඩාත් වැදගත් වේ.
marbel

දුප්පත්, අමතක වූ දේ අපි අමතක නොකරමුeapply
JDL

පොදුවේ විශිෂ්ට පිළිතුරක් ඇත, නමුත් මම සිතන්නේ එය එහි උපයෝගීතාව vapplyසහ අවාසි අවතක්සේරු කරයි sapply. මෙහි ඇති ප්‍රධාන වාසියක් vapplyනම් එය ප්‍රතිදාන වර්ගය සහ දිග බලාත්මක කිරීමයි, එබැවින් ඔබ අවසන් අපේක්ෂිත ප්‍රතිදානය හෝ තොරතුරු දෝෂයක් සමඟ අවසන් වනු ඇත. අනෙක් අතට, sapplyසෑම විටම පැහැදිලි නැති නීති රීති පහත දැක්වෙන නීති සරල කිරීමට උත්සාහ කරනු ඇති අතර වෙනත් ආකාරයකින් ලැයිස්තුවකට වැටෙනු ඇත. උදාහරණයක් ලෙස, මෙය නිපදවන නිමැවුම් වර්ගය පුරෝකථනය කිරීමට උත්සාහ කරන්න : sapply(list(1:5, 6:10, matrix(1:4, 2)), function(x) head(x, 1)). කුමක් ගැනද sapply(list(matrix(1:4, 2), matrix(1:4, 2)), ...)?
ඇලෙක්සි ෂික්ලෝමානොව්

135

Http://www.slideshare.net/hadley/plyr-one-data-analytic-strategy හි 21 වන විනිවිදකයේ සිට :

අයදුම් කරන්න, සාරවත් කරන්න, ලැප්ලි කරන්න, විසින්, සමස්තයක් ලෙස

(අපගේ බලාපොරොත්තුව බව පැහැදිලි වේ applyHadley ගේ @ කිරීමට අනුරූප aaplyහා aggregate@ Hadley ගේ කිරීමට අනුරූප ddplyආදිය එම slideshare 20 ඔබ මෙම රූපය සිට එය ලබා ගැනීමට නොහැකි නම් පැහැදිලි කර ගත හැකි වනු ඇත සර්පණය කරන්න.)

(වම්පස ආදානය වේ, ඉහළින් ප්‍රතිදානය ඇත)


4
විනිවිදකයේ යතුරු ලියනය තිබේද? ඉහළ වම් කොටුව aaply විය යුතුය
JHowIX

102

පළමුව ජොරාන්ගේ විශිෂ්ට පිළිතුරෙන් ආරම්භ කරන්න - සැක සහිත ඕනෑම දෙයකට එය වඩා හොඳ විය හැකිය.

එවිට පහත දැක්වෙන මතක සටහන් එක් එක් අතර වෙනස මතක තබා ගැනීමට උපකාරී වේ. සමහර ඒවා පැහැදිලිව පෙනෙන අතර අනෙක් ඒවා එතරම් අඩු නොවිය හැකිය --- මේ සඳහා ඔබ ජෝරාන්ගේ සාකච්ඡාවලදී සාධාරණීකරණය කරනු ඇත.

සිහිවටන

  • lapplyයනු ලැයිස්තුව ලැයිස්තුවක් හෝ දෛශික මත ක්රියා හා ලැයිස්තුවක් නැවත වන අදාළ වේ.
  • sapplyයනු සරල lapply (විය හැකි විට දෛශික හෝ න්යාසය නැවත කටයුතු කිරීමට පෙරනිමි)
  • vapplyඑය ඇත අයදුම් තහවුරු (නැවත වස්තුව වර්ගය prespecified කිරීමට ඉඩ ලබා දෙයි)
  • rapplyයනු කැදැලි ලැයිස්තු සඳහා පුනරාවර්තන යෙදුමකි , එනම් ලැයිස්තු තුළ ඇති ලැයිස්තු
  • tapplyඑය ඇත tagged ටැගයන් මෙම අවධියේ පසුවේ හඳුනා එහිදී අදාළ
  • applyGeneric බලපත්රය යටතේ අවසර ලබා ඇත : (මාලාවක් මානයන් සඳහා, වඩාත් පොදුවේ හෝ,) අනුකෘතියක් ගේ පේළි හෝ තීරු ලිපි උත්සවයකට අදාළ

නිවැරදි පසුබිම ගොඩනැගීම

applyපවුල භාවිතා කිරීම ඔබට තවමත් තරමක් en ත් වී ඇති බවක් හැඟේ නම්, සමහර විට ඔබට ප්‍රධාන දෘෂ්ටි කෝණයක් නැති වී යන්නට ඇත.

මෙම ලිපි දෙක උපකාරී වේ. පවුලේ සාමාජිකයන් විසින් සපයනු ලබන ක්‍රියාකාරී ක්‍රමලේඛන ක්‍රමවේදයන් පෙළඹවීම සඳහා අවශ්‍ය පසුබිම ඔවුන් සපයයි apply.

Lisp භාවිතා කරන්නන් වහාම එම ආදර්ශය හඳුනා ගනු ඇත. ඔබ ලිස්ප් ගැන හුරු නැතිනම්, ඔබ ඔබේ හිස එෆ්.පී. වටා ගෙන ගිය පසු, ඔබ ආර් හි භාවිතය සඳහා ප්‍රබල දෘෂ්ටි කෝණයක් ලබා applyගනු ඇත - තවද එය වඩාත් අර්ථවත් වනු ඇත.


51

මෙම ලිපියේ (ඉතා විශිෂ්ට) පිළිතුරු නොමැති බව byසහ aggregateපැහැදිලි කිරීම් නොමැති බව මම තේරුම් ගත් බැවින් . මෙන්න මගේ දායකත්වය.

විසින්

මෙම byලේඛගතකිරීම සඳහන් පරිදි කාර්යය, සඳහා "දවටනය" ලෙස, නමුත් විය හැකි tapply. byඅපට tapplyහැසිරවිය නොහැකි කාර්යයක් ගණනය කිරීමට අවශ්‍ය වූ විට එහි බලය පැන නගී . එක් උදාහරණයක් නම් මෙම කේතය:

ct <- tapply(iris$Sepal.Width , iris$Species , summary )
cb <- by(iris$Sepal.Width , iris$Species , summary )

 cb
iris$Species: setosa
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.300   3.200   3.400   3.428   3.675   4.400 
-------------------------------------------------------------- 
iris$Species: versicolor
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   2.525   2.800   2.770   3.000   3.400 
-------------------------------------------------------------- 
iris$Species: virginica
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.200   2.800   3.000   2.974   3.175   3.800 


ct
$setosa
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.300   3.200   3.400   3.428   3.675   4.400 

$versicolor
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   2.525   2.800   2.770   3.000   3.400 

$virginica
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.200   2.800   3.000   2.974   3.175   3.800 

අපි මෙම වස්තූන් දෙකක් මුද්රණය කිරීම, නම් ctසහ cbඅපි "තේරුම වන්නේ" එකම ප්රතිඵල සහ එකම වෙනස්කම් ඔවුන් පෙන්වා ඇති ආකාරය සහ විවිධ වේ classපිළිවෙළින්, උපලක්ෂණ byසඳහා cbසහ arrayසඳහා ct.

මා පවසා ඇති පරිදි, byඅපට භාවිතා කළ නොහැකි විට එහි බලය පැන නගී tapply; පහත කේතය එක් උදාහරණයකි:

 tapply(iris, iris$Species, summary )
Error in tapply(iris, iris$Species, summary) : 
  arguments must have same length

R පවසන්නේ තර්ක වලට එකම දිගක් තිබිය යුතු බවයි, “අපට අවශ්‍ය summaryසියලු විචල්‍යයන් irisසාධකය ඔස්සේ ගණනය කිරීමට අවශ්‍යයි” යැයි පවසන්න Species: නමුත් R ට එය කළ නොහැක්කේ එය හැසිරවිය යුතු ආකාරය නොදන්නා බැවිනි.

byR ශ්‍රිතය සමඟ data frameපන්තිය සඳහා නිශ්චිත ක්‍රමවේදයක් යවා summaryපළමු තර්කයේ දිග (සහ වර්ගය ද) වෙනස් වුවද ශ්‍රිතය ක්‍රියා කිරීමට ඉඩ දෙන්න .

bywork <- by(iris, iris$Species, summary )

bywork
iris$Species: setosa
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.300   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:4.800   1st Qu.:3.200   1st Qu.:1.400   1st Qu.:0.200   versicolor: 0  
 Median :5.000   Median :3.400   Median :1.500   Median :0.200   virginica : 0  
 Mean   :5.006   Mean   :3.428   Mean   :1.462   Mean   :0.246                  
 3rd Qu.:5.200   3rd Qu.:3.675   3rd Qu.:1.575   3rd Qu.:0.300                  
 Max.   :5.800   Max.   :4.400   Max.   :1.900   Max.   :0.600                  
-------------------------------------------------------------- 
iris$Species: versicolor
  Sepal.Length    Sepal.Width     Petal.Length   Petal.Width          Species  
 Min.   :4.900   Min.   :2.000   Min.   :3.00   Min.   :1.000   setosa    : 0  
 1st Qu.:5.600   1st Qu.:2.525   1st Qu.:4.00   1st Qu.:1.200   versicolor:50  
 Median :5.900   Median :2.800   Median :4.35   Median :1.300   virginica : 0  
 Mean   :5.936   Mean   :2.770   Mean   :4.26   Mean   :1.326                  
 3rd Qu.:6.300   3rd Qu.:3.000   3rd Qu.:4.60   3rd Qu.:1.500                  
 Max.   :7.000   Max.   :3.400   Max.   :5.10   Max.   :1.800                  
-------------------------------------------------------------- 
iris$Species: virginica
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.900   Min.   :2.200   Min.   :4.500   Min.   :1.400   setosa    : 0  
 1st Qu.:6.225   1st Qu.:2.800   1st Qu.:5.100   1st Qu.:1.800   versicolor: 0  
 Median :6.500   Median :3.000   Median :5.550   Median :2.000   virginica :50  
 Mean   :6.588   Mean   :2.974   Mean   :5.552   Mean   :2.026                  
 3rd Qu.:6.900   3rd Qu.:3.175   3rd Qu.:5.875   3rd Qu.:2.300                  
 Max.   :7.900   Max.   :3.800   Max.   :6.900   Max.   :2.500     

එය සැබවින්ම ක්‍රියාත්මක වන අතර ප්‍රති result ලය ඉතා පුදුම සහගතය. එය පන්තියේ වස්තුවක් byඔස්සේ බව Species(ඔවුන් එක් එක් සඳහා, කියන්න) ගණනය summaryඑක් එක් විචල්ය වන.

පළමු තර්කය a නම් data frame, පිටත් කරන ලද ශ්‍රිතයට එම පන්තියේ වස්තු සඳහා ක්‍රමයක් තිබිය යුතු බව සලකන්න . නිදසුනක් ලෙස, අපි මෙම කේතය meanශ්‍රිතය සමඟ භාවිතා කරන්නේ කිසිසේත්ම තේරුමක් නැති මෙම කේතය අපට ඇත:

 by(iris, iris$Species, mean)
iris$Species: setosa
[1] NA
------------------------------------------- 
iris$Species: versicolor
[1] NA
------------------------------------------- 
iris$Species: virginica
[1] NA
Warning messages:
1: In mean.default(data[x, , drop = FALSE], ...) :
  argument is not numeric or logical: returning NA
2: In mean.default(data[x, , drop = FALSE], ...) :
  argument is not numeric or logical: returning NA
3: In mean.default(data[x, , drop = FALSE], ...) :
  argument is not numeric or logical: returning NA

සමස්ථ

aggregatetapplyඅප එය එලෙස භාවිතා කරන්නේ නම් එය වෙනත් භාවිත ක්‍රමයක් ලෙස දැකිය හැකිය .

at <- tapply(iris$Sepal.Length , iris$Species , mean)
ag <- aggregate(iris$Sepal.Length , list(iris$Species), mean)

 at
    setosa versicolor  virginica 
     5.006      5.936      6.588 
 ag
     Group.1     x
1     setosa 5.006
2 versicolor 5.936
3  virginica 6.588

වහාම වෙනස්කම් දෙකක් දෙවන තර්කය වේ aggregate යුතුය අතර ලැයිස්තුවක් විය tapply හැකි (අනිවාර්ය නොවේ) ලැයිස්තුවක් විය හා ප්රතිදානය බව aggregateඅතර වූ එක් දත්ත රාමුවක් tapplyයනු array.

එහි බලය aggregateවන්නේ එයට දත්තවල උප කුලක පහසුවෙන් subsetතර්කයෙන් හැසිරවිය හැකි බවත් එයට tsවස්තූන් සඳහා ක්‍රමවේදයන් ඇති බවත් ය formula.

මෙම මූලද්රව්ය සමහර අවස්ථාවන්හිදී aggregateඒ සමඟ වැඩ කිරීම පහසු කරයි tapply. මෙන්න උදාහරණ කිහිපයක් (ප්‍රලේඛනයෙන් ලබා ගත හැකිය):

ag <- aggregate(len ~ ., data = ToothGrowth, mean)

 ag
  supp dose   len
1   OJ  0.5 13.23
2   VC  0.5  7.98
3   OJ  1.0 22.70
4   VC  1.0 16.77
5   OJ  2.0 26.06
6   VC  2.0 26.14

අපට එය සාක්ෂාත් කරගත හැකි tapplyනමුත් වාක්‍ය ඛණ්ඩය තරමක් අමාරු වන අතර ප්‍රතිදානය (සමහර තත්වයන් යටතේ) කියවිය නොහැකි තරම්:

att <- tapply(ToothGrowth$len, list(ToothGrowth$dose, ToothGrowth$supp), mean)

 att
       OJ    VC
0.5 13.23  7.98
1   22.70 16.77
2   26.06 26.14

අපට භාවිතා කළ නොහැකි byහෝ භාවිතා කළ යුතු වෙනත් අවස්ථා tapplyතිබේ aggregate.

 ag1 <- aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean)

 ag1
  Month    Ozone     Temp
1     5 23.61538 66.73077
2     6 29.44444 78.22222
3     7 59.11538 83.88462
4     8 59.96154 83.96154
5     9 31.44828 76.89655

අපට පෙර tapplyඇමතුමකින් පෙර ප්‍රති result ලය ලබා ගත නොහැකි නමුත් Monthඑක් එක් මූලද්‍රව්‍යයන් සඳහා මධ්‍යන්‍යය ගණනය කර ඒවා ඒකාබද්ධ කළ යුතුය (තවද අප ඇමතිය යුතු බව සලකන්න na.rm = TRUE, මන්ද ශ්‍රිතයේ formulaක්‍රම aggregateපෙරනිමියෙන් ඇති නිසා na.action = na.omit):

ta1 <- tapply(airquality$Ozone, airquality$Month, mean, na.rm = TRUE)
ta2 <- tapply(airquality$Temp, airquality$Month, mean, na.rm = TRUE)

 cbind(ta1, ta2)
       ta1      ta2
5 23.61538 65.54839
6 29.44444 79.10000
7 59.11538 83.90323
8 59.96154 83.96774
9 31.44828 76.90000

සමග වන අතර byඅපි ළඟාකර ගත නොහැකි ඇත්ත පහත සඳහන් කාර්යය ඇමතුමක් දෝෂයක් නැවත බව (නමුත්, බොහෝ දුරට එය කර්මයක් කාර්යය හා සම්බන්ධ වේ, mean):

by(airquality[c("Ozone", "Temp")], airquality$Month, mean, na.rm = TRUE)

වෙනත් වේලාවක ප්‍රති results ල සමාන වන අතර වෙනස්කම් පන්තියේ පමණක් වේ (ඉන්පසු එය පෙන්වන ආකාරය / මුද්‍රණය කර ඇති ආකාරය පමණක් නොව - උදාහරණයක් ලෙස, එය උප කුලක කරන්නේ කෙසේද) වස්තුව:

byagg <- by(airquality[c("Ozone", "Temp")], airquality$Month, summary)
aggagg <- aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, summary)

පෙර කේතය එකම ඉලක්කයක් හා ප්‍රති results ල අත්කර ගනී, සමහර අවස්ථාවලදී භාවිතා කළ යුතු මෙවලම පුද්ගලික රුචි අරුචිකම් හා අවශ්‍යතා පමණක් වේ; පෙර වස්තූන් දෙක උප කුලකයට වඩා වෙනස් අවශ්‍යතා ඇත.


මා පවසා ඇති පරිදි, අපට ටැප්ලි භාවිතා කළ නොහැකි විට එහි බලය පැන නගී; පහත කේතය එක් උදාහරණයකි: මෙය ඔබ ඉහත භාවිතා කළ වචන වේ. සාරාංශය ගණනය කිරීම සඳහා ඔබ උදාහරණයක් ලබා දී ඇත. හොඳින් සාරාංශයක් සංඛ්යා ලේඛන පිරිසිදු අවශ්ය බව පමණක් ගණනය කල හැකි බව කියන්න ඉඩ දෙනවා: උදා: data.frame(tapply(unlist(iris[,-5]),list(rep(iris[,5],ncol(iris[-5])),col(iris[-5])),summary))මෙම tapply ක, භාවිතයට . With the right splitting there is nothing you cant do with tapply . The only thing is it returns a matrix. Please be careful by saying we cant use tapply`
Onyambu

35

එක් එක් ශ්‍රිතය සඳහා භාවිත අවස්ථා වල වෙනස්කම් සාකච්ඡා කරන විශිෂ්ට පිළිතුරු රාශියක් ඇත. කිසිම පිළිතුරක් කාර්ය සාධනයේ වෙනස්කම් සාකච්ඡා නොකරයි. විවිධ කාර්යයන් විවිධ ආදානයන් අපේක්ෂා කරන අතර විවිධ නිමැවුම් නිපදවන නමුත් එය බොහෝමයක් ශ්‍රේණි / කණ්ඩායම් අනුව ඇගයීමට පොදු පොදු අරමුණක් ඇත. මගේ පිළිතුර කාර්ය සාධනය කෙරෙහි අවධානය යොමු කිරීමට යන්නේ. ඉහත නිසා දෛශික වලින් ආදාන නිර්මාණය කාලසටහනට ඇතුළත් කර ඇති අතර, applyශ්‍රිතය මනිනු නොලැබේ.

මම වෙනස් කාර්යයන් දෙකක් පරීක්ෂාවට ලක් කර ඇත sumසහ lengthඑකවර. පරිමාව පරික්ෂා කිරීම ආදානයේ 50M සහ ප්‍රතිදානයේ 50K වේ. මම ද පුළුල් ලෙස ප්රශ්න විමසූ විට එවකට භාවිතා නොකරන ලද දැනට ජනප්රිය පැකේජ දෙකක් ඇතුළත් කර තිබේ, data.tableහා dplyr. ඔබ හොඳ කාර්ය සාධනයක් අපේක්ෂා කරන්නේ දැයි බැලීමට අනිවාර්යයෙන්ම දෙකම වටී.

library(dplyr)
library(data.table)
set.seed(123)
n = 5e7
k = 5e5
x = runif(n)
grp = sample(k, n, TRUE)

timing = list()

# sapply
timing[["sapply"]] = system.time({
    lt = split(x, grp)
    r.sapply = sapply(lt, function(x) list(sum(x), length(x)), simplify = FALSE)
})

# lapply
timing[["lapply"]] = system.time({
    lt = split(x, grp)
    r.lapply = lapply(lt, function(x) list(sum(x), length(x)))
})

# tapply
timing[["tapply"]] = system.time(
    r.tapply <- tapply(x, list(grp), function(x) list(sum(x), length(x)))
)

# by
timing[["by"]] = system.time(
    r.by <- by(x, list(grp), function(x) list(sum(x), length(x)), simplify = FALSE)
)

# aggregate
timing[["aggregate"]] = system.time(
    r.aggregate <- aggregate(x, list(grp), function(x) list(sum(x), length(x)), simplify = FALSE)
)

# dplyr
timing[["dplyr"]] = system.time({
    df = data_frame(x, grp)
    r.dplyr = summarise(group_by(df, grp), sum(x), n())
})

# data.table
timing[["data.table"]] = system.time({
    dt = setnames(setDT(list(x, grp)), c("x","grp"))
    r.data.table = dt[, .(sum(x), .N), grp]
})

# all output size match to group count
sapply(list(sapply=r.sapply, lapply=r.lapply, tapply=r.tapply, by=r.by, aggregate=r.aggregate, dplyr=r.dplyr, data.table=r.data.table), 
       function(x) (if(is.data.frame(x)) nrow else length)(x)==k)
#    sapply     lapply     tapply         by  aggregate      dplyr data.table 
#      TRUE       TRUE       TRUE       TRUE       TRUE       TRUE       TRUE 

# print timings
as.data.table(sapply(timing, `[[`, "elapsed"), keep.rownames = TRUE
              )[,.(fun = V1, elapsed = V2)
                ][order(-elapsed)]
#          fun elapsed
#1:  aggregate 109.139
#2:         by  25.738
#3:      dplyr  18.978
#4:     tapply  17.006
#5:     lapply  11.524
#6:     sapply  11.326
#7: data.table   2.686

යෙදුම් ක්‍රියාකාරිත්වයට වඩා dplyr අඩු වීම සාමාන්‍ය දෙයක්ද?
මොස්ටාෆා

1
ImDimitriPetrenko මම එහෙම හිතන්නේ නැහැ, ඇයි මෙතන ඉන්නේ කියලා විශ්වාස නෑ. බොහෝ සාධක ක්‍රියාත්මක වන බැවින් ඔබේම දත්ත වලට එරෙහිව පරීක්ෂා කිරීම වඩාත් සුදුසුය.
jangorecki

28

මෙහි සියලු විශිෂ්ට පිළිතුරු තිබියදීත්, සඳහන් කළ යුතු තවත් මූලික කාර්යයන් 2 ක් ඇත, ප්‍රයෝජනවත් outerශ්‍රිතය සහ අපැහැදිලි eapplyශ්‍රිතය

පිටත

outerයනු වඩාත් ලෞකික එකක් ලෙස සැඟවී ඇති ඉතා ප්‍රයෝජනවත් කාර්යයකි. outerඑහි විස්තරය සඳහා ඔබ කියවන්නේ නම් :

The outer product of the arrays X and Y is the array A with dimension  
c(dim(X), dim(Y)) where element A[c(arrayindex.x, arrayindex.y)] =   
FUN(X[arrayindex.x], Y[arrayindex.y], ...).

මෙය රේඛීය වීජ ගණිත වර්ග සඳහා පමණක් ප්‍රයෝජනවත් බව පෙනේ. කෙසේ වෙතත්, එය mapplyආදාන දෛශික දෙකකට ශ්‍රිතයක් යෙදීමට බොහෝ දුරට භාවිතා කළ හැකිය . වෙනස වන්නේ mapplyපළමු මූලද්‍රව්‍ය දෙකටත් දෙවන දෙවන යනාදියටත් outerශ්‍රිතය අදාළ වන අතර පළමු දෛශිකයේ සිට එක් මූලද්‍රව්‍යයක සෑම සංයෝජනයක් සඳහාම ශ්‍රිතය අදාළ වේ. උදාහරණයක් වශයෙන්:

 A<-c(1,3,5,7,9)
 B<-c(0,3,6,9,12)

mapply(FUN=pmax, A, B)

> mapply(FUN=pmax, A, B)
[1]  1  3  6  9 12

outer(A,B, pmax)

 > outer(A,B, pmax)
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    3    6    9   12
 [2,]    3    3    6    9   12
 [3,]    5    5    6    9   12
 [4,]    7    7    7    9   12
 [5,]    9    9    9    9   12

සාරධර්ම දෛශිකයක් සහ කොන්දේසි දෛශිකයක් ඇති විට මම පෞද්ගලිකව මෙය භාවිතා කර ඇති අතර කුමන කොන්දේසි සපුරා ඇත්දැයි බැලීමට බලාපොරොත්තු වෙමි.

eapply

eapplyඑය lapplyලැයිස්තුවේ සෑම මූලද්‍රව්‍යයක් සඳහාම ශ්‍රිතයක් යෙදීමට වඩා, එය පරිසරයක සෑම මූලද්‍රව්‍යයකටම ශ්‍රිතයක් අදාළ කරයි. උදාහරණයක් ලෙස ඔබට ගෝලීය පරිසරය තුළ පරිශීලක අර්ථ දක්වන ලද කාර්යයන් ලැයිස්තුවක් සොයා ගැනීමට අවශ්‍ය නම්:

A<-c(1,3,5,7,9)
B<-c(0,3,6,9,12)
C<-list(x=1, y=2)
D<-function(x){x+1}

> eapply(.GlobalEnv, is.function)
$A
[1] FALSE

$B
[1] FALSE

$C
[1] FALSE

$D
[1] TRUE 

අවංකවම මම මෙය එතරම් භාවිතා නොකරමි, නමුත් ඔබ බොහෝ පැකේජ ගොඩනඟන්නේ නම් හෝ බොහෝ පරිසරයන් නිර්මාණය කරන්නේ නම් එය ප්‍රයෝජනවත් විය හැකිය.


25

එය සඳහන් කිරීම වටී ave. avetapplyගේ හිතකාමී ඥාති සහෝදරයා. එය ප්‍රති data ල මඟින් ඔබේ දත්ත රාමුවට කෙලින්ම සම්බන්ධ කළ හැකිය.

dfr <- data.frame(a=1:20, f=rep(LETTERS[1:5], each=4))
means <- tapply(dfr$a, dfr$f, mean)
##  A    B    C    D    E 
## 2.5  6.5 10.5 14.5 18.5 

## great, but putting it back in the data frame is another line:

dfr$m <- means[dfr$f]

dfr$m2 <- ave(dfr$a, dfr$f, FUN=mean) # NB argument name FUN is needed!
dfr
##   a f    m   m2
##   1 A  2.5  2.5
##   2 A  2.5  2.5
##   3 A  2.5  2.5
##   4 A  2.5  2.5
##   5 B  6.5  6.5
##   6 B  6.5  6.5
##   7 B  6.5  6.5
##   ...

එහි පදනම ඇසුරුම තුල කිසිවක් මෙන් වැඩ බව ය ave(සමස්තයක් ලෙස දත්ත රාමු සඳහා byවගේ tapplyදත්ත රාමු සඳහා). නමුත් ඔබට එය විකාර කළ හැකිය:

dfr$foo <- ave(1:nrow(dfr), dfr$f, FUN=function(x) {
    x <- dfr[x,]
    sum(x$m*x$m2)
})
dfr
##     a f    m   m2    foo
## 1   1 A  2.5  2.5    25
## 2   2 A  2.5  2.5    25
## 3   3 A  2.5  2.5    25
## ...

12

මම මෑතකදී තරමක් ප්‍රයෝජනවත් sweepශ්‍රිතය සොයාගත් අතර එය සම්පූර්ණත්වය සඳහා මෙහි එක් කරන්න:

අතුගාන්න

මූලික අදහස නම් අරාව පේළියකින් හෝ තීරු ආකාරයෙන් අතුගා නවීකරණය කරන ලද අරාවක් ආපසු ලබා දීමයි. උදාහරණයක් මගින් මෙය පැහැදිලි වනු ඇත (මූලාශ්‍රය: ඩේටාකැම්ප් ):

ඔබට අනුකෘතියක් ඇති බවත් එය තීරු අනුව ප්‍රමිතිකරණය කිරීමට අවශ්‍ය බවත් කියමු :

dataPoints <- matrix(4:15, nrow = 4)

# Find means per column with `apply()`
dataPoints_means <- apply(dataPoints, 2, mean)

# Find standard deviation with `apply()`
dataPoints_sdev <- apply(dataPoints, 2, sd)

# Center the points 
dataPoints_Trans1 <- sweep(dataPoints, 2, dataPoints_means,"-")

# Return the result
dataPoints_Trans1
##      [,1] [,2] [,3]
## [1,] -1.5 -1.5 -1.5
## [2,] -0.5 -0.5 -0.5
## [3,]  0.5  0.5  0.5
## [4,]  1.5  1.5  1.5

# Normalize
dataPoints_Trans2 <- sweep(dataPoints_Trans1, 2, dataPoints_sdev, "/")

# Return the result
dataPoints_Trans2
##            [,1]       [,2]       [,3]
## [1,] -1.1618950 -1.1618950 -1.1618950
## [2,] -0.3872983 -0.3872983 -0.3872983
## [3,]  0.3872983  0.3872983  0.3872983
## [4,]  1.1618950  1.1618950  1.1618950

සැ.යු: මෙම සරල උදාහරණය සඳහා එකම ප්‍රති result ලය වඩා පහසුවෙන් ලබා ගත හැකිය
apply(dataPoints, 2, scale)


1
මෙය කණ්ඩායම්කරණයට සම්බන්ධද?
ෆ්‍රෑන්ක්

2
Ran ෆ්‍රෑන්ක්: හොඳයි, ඔබ සමඟ අවංකව කටයුතු කිරීම මෙම පෝස්ට් එකේ මාතෘකාව තරමක් නොමඟ යවන සුළුය: ඔබ එම ප්‍රශ්නයම කියවන විට එය “අදාළ පවුල” ගැන වේ. sweepමෙහි සඳහන් කර ඇති අනෙක් සියල්ලම මෙන් ඉහළ පෙළේ ශ්‍රිතයකි, උදා apply. sapply, lapplyඑබැවින් පිළිගත් පිළිතුර ගැන උච්චාරණ 1,000 කට වඩා වැඩි ගණනක් සහ එහි දක්වා ඇති උදාහරණ ගැන විමසිය හැකිය. එහි දී ඇති උදාහරණය දෙස බලන්න apply.
vonjd

2
ස්වීප් සතුව නොමඟ යවන නමක්, නොමඟ යවන පෙරනිමි සහ නොමඟ යවන පරාමිති නාමයක් ඇත :). මට එය මේ ආකාරයෙන් තේරුම් ගැනීම පහසුය: 1) STATS යනු දෛශික හෝ තනි අගයක් වන අතර එය පළමු ආදානයට සමාන ප්‍රමාණයේ අනුකෘතියක් සෑදීම සඳහා නැවත නැවතත් කරනු ලැබේ, 2) 1 වන ආදානය සහ මෙම නව අනුකෘතිය මත FUN යොදනු ලැබේ. සමහර විට වඩා හොඳින් නිදර්ශනය කර ඇත්තේ : sweep(matrix(1:6,nrow=2),2,7:9,list). එය සාමාන්‍යයෙන් වඩා කාර්යක්ෂම applyවන්නේ applyලූප, sweepදෛශිකකරණය කළ හැකි ශ්‍රිත භාවිතා කිරීමට හැකි බැවිනි.
මූඩි_මුඩ්ස්කිපර්

2

CRAN හි මෑතකදී නිකුත් කරන ලද බිඳවැටීම් පැකේජයේ, මම බොහෝ පොදු යෙදුම් ක්‍රියාකාරිත්වය ශ්‍රිත 2 කට සම්පීඩනය කිරීමට උත්සාහ කර ඇත:

  1. dapply(දත්ත-අයදුම් කරන්න) පේළි හෝ (පෙරනිමි) තීරු වලට අනුරූපී වේ drop = TRUE. කාර්ය සාධනය lapplydata.frame තීරු සඳහා සැසඳිය හැකි අතර applyඅනුකෘති පේළි හෝ තීරු වලට වඩා 2x ක් වේගවත් වේ . සමාන්තරකරණය ලබා ගත mclapplyහැක්කේ (MAC සඳහා පමණි).

වාක්‍ය ඛණ්ඩය:

dapply(X, FUN, ..., MARGIN = 2, parallel = FALSE, mc.cores = 1L, 
       return = c("same", "matrix", "data.frame"), drop = TRUE)

උදාහරණ:

# Apply to columns:
dapply(mtcars, log)
dapply(mtcars, sum)
dapply(mtcars, quantile)
# Apply to rows:
dapply(mtcars, sum, MARGIN = 1)
dapply(mtcars, quantile, MARGIN = 1)
# Return as matrix:
dapply(mtcars, quantile, return = "matrix")
dapply(mtcars, quantile, MARGIN = 1, return = "matrix")
# Same for matrices ...
  1. BYදෛශික, අනුකෘතිය සහ දත්ත.ෆ්‍රේම් ක්‍රමය සමඟ බෙදීම්-යෙදවුම්-ඒකාබද්ධ පරිගණක සඳහා S3 සාමාන්‍යයකි. එය වඩා සැලකිය යුතු වේගයකින් යුක්ත tapplyවන byඅතර aggregate( plyrවිශාල දත්ත dplyrවලට වඩා වේගවත් වේ).

වාක්‍ය ඛණ්ඩය:

BY(X, g, FUN, ..., use.g.names = TRUE, sort = TRUE,
   expand.wide = FALSE, parallel = FALSE, mc.cores = 1L,
   return = c("same", "matrix", "data.frame", "list"))

උදාහරණ:

# Vectors:
BY(iris$Sepal.Length, iris$Species, sum)
BY(iris$Sepal.Length, iris$Species, quantile)
BY(iris$Sepal.Length, iris$Species, quantile, expand.wide = TRUE) # This returns a matrix 
# Data.frames
BY(iris[-5], iris$Species, sum)
BY(iris[-5], iris$Species, quantile)
BY(iris[-5], iris$Species, quantile, expand.wide = TRUE) # This returns a wider data.frame
BY(iris[-5], iris$Species, quantile, return = "matrix") # This returns a matrix
# Same for matrices ...

කණ්ඩායම් විචල්යයන්ගේ ලැයිස්තු ද සැපයිය හැකිය g.

කාර්ය සාධනය ගැන කතා කිරීම: බිඳවැටීමේ ප්‍රධාන පරමාර්ථය වන්නේ ආර් හි ඉහළ කාර්යසාධනයක් සහිත වැඩසටහන් පෝෂණය කිරීම සහ බෙදීම්-යෙදුම්-ඒකාබද්ධයෙන් ඔබ්බට ගමන් කිරීමයි. මෙම අරමුණු ඉටු කර ගැනීම සඳහා මෙම පැකේජය C ++ පදනම් වේගයෙන් Generic බලපත්රය යටතේ අවසර ලබා ඇත කාර්යයන් සම්පූර්ණ මාලාවක් ඇත: fmean, fmedian, fmode, fsum, fprod, fsd, fvar, fmin,fmax , ffirst, flast, fNobs, fNdistinct, fscale, fbetween, fwithin, fHDbetween, fHDwithin, flag, fdiffහාfgrowth . ඔවුන් දත්ත හරහා තනි වර්‍ගයකින් කණ්ඩායම් ගණනය කිරීම් සිදු කරයි (එනම් බෙදීම් සහ නැවත එකතු කිරීමක් නැත).

වාක්‍ය ඛණ්ඩය:

fFUN(x, g = NULL, [w = NULL,] TRA = NULL, [na.rm = TRUE,] use.g.names = TRUE, drop = TRUE)

උදාහරණ:

v <- iris$Sepal.Length
f <- iris$Species

# Vectors
fmean(v)             # mean
fmean(v, f)          # grouped mean
fsd(v, f)            # grouped standard deviation
fsd(v, f, TRA = "/") # grouped scaling
fscale(v, f)         # grouped standardizing (scaling and centering)
fwithin(v, f)        # grouped demeaning

w <- abs(rnorm(nrow(iris)))
fmean(v, w = w)      # Weighted mean
fmean(v, f, w)       # Weighted grouped mean
fsd(v, f, w)         # Weighted grouped standard-deviation
fsd(v, f, w, "/")    # Weighted grouped scaling
fscale(v, f, w)      # Weighted grouped standardizing
fwithin(v, f, w)     # Weighted grouped demeaning

# Same using data.frames...
fmean(iris[-5], f)                # grouped mean
fscale(iris[-5], f)               # grouped standardizing
fwithin(iris[-5], f)              # grouped demeaning

# Same with matrices ...

පැකේජයේ විග්නෙට් තුළ මම මිණුම් සලකුණු ලබා දෙමි. වේගවත් කාර්යයන් සමඟ ක්‍රමලේඛනය සමඟ වැඩසටහන්කරණයට වඩා සැලකිය යුතු වේගයකින් යුක්ත වේ dplyr හෝ data.table යුක්ත වේ , විශේෂයෙන් කුඩා දත්ත මත පමණක් නොව විශාල දත්ත මතද.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.