2011-05-15 95 views
6

我有一個相當棘手的問題,而我似乎無法解決這個問題。如何計算R中某一行中特定值的出現次數

我有一個大的數據集(23277行,151列)。每列的值均爲0:100(含),表示世界上事件的概率。

作爲計算每個人的分數的一部分,我需要計算數據集中每個值的出現次數。

我第一次嘗試申請,但我需要忽略NA的,和子集,所以,當我嘗試了以下內容:

apply(ans.samp, 1, sum(ans.samp[ans==0]), na.rm=TRUE) 

我得到的錯誤信息:SUM(ans.samp [ANS == 0] )'是不是函數,字符或符號

我重複這個過程與sapply,vapply,tapply和do.call無濟於事。

放棄矢量化解決方案,我寫了以下for循環。

RespCount <- function (x) { for (i in (1:nrow(x))) 
    { res <- vector(mode="numeric", length=nrow(x)) 
    ans.tmp <- x[i,] 
    res[i] <- length(ans.tmp[ans.tmp==0]) 
    print(res) 
    } 
return(res) 
} 

但是,我得到這個工作後,它只返回樣本中O的總和。

我希望得到一些幫助,因爲我受到了一些時間的壓力,我希望能夠在將來解決R中的這些問題。包含用於重現

樣本數據:

structure(list(X = 1:6, X100 = c(70L, NA, 80L, 0L, 40L, NA), 
    X10 = c(30L, NA, NA, NA, NA, NA), X1 = c(50L, NA, NA, NA, 
    NA, NA), X11 = c(50L, NA, NA, NA, NA, NA), X12 = c(30L, NA, 
    NA, NA, NA, NA), X13 = c(50L, NA, NA, NA, NA, NA), X14 = c(70L, 
    NA, NA, NA, NA, NA), X15 = c(60L, NA, NA, NA, NA, NA), X158 = c(30L, 
    NA, NA, NA, NA, NA), X159 = c(50L, NA, NA, NA, NA, NA), X160 = c(80L, 
    NA, NA, NA, NA, NA), X16 = c(50L, NA, NA, NA, NA, NA), X161 = c(40L, 
    NA, NA, NA, NA, NA), X162 = c(100L, NA, NA, NA, NA, NA), 
    X163 = c(50L, NA, NA, NA, NA, NA), X164 = c(0L, NA, NA, NA, 
    NA, NA), X165 = c(0L, NA, NA, NA, NA, NA), X166 = c(20L, 
    NA, NA, NA, NA, NA), X167 = c(0L, NA, NA, NA, NA, NA), X168 = c(30L, 
    NA, NA, NA, NA, NA), X169 = c(100L, NA, NA, NA, NA, NA), 
    X170 = c(30L, NA, NA, NA, NA, NA), X17 = c(40L, NA, NA, NA, 
    NA, NA), X171 = c(50L, NA, NA, NA, NA, NA), X172 = c(20L, 
    NA, NA, NA, NA, NA), X173 = c(30L, NA, NA, NA, NA, NA), X174 = c(20L, 
    NA, NA, NA, NA, NA), X175 = c(30L, NA, NA, NA, NA, NA), X176 = c(10L, 
    NA, NA, NA, NA, NA), X177 = c(70L, NA, NA, NA, NA, NA), X178 = c(40L, 
    NA, NA, NA, NA, NA), X179 = c(70L, NA, NA, NA, NA, NA), X180 = c(0L, 
    NA, NA, NA, NA, NA), X18 = c(30L, NA, NA, NA, NA, NA), X181 = c(100L, 
    NA, NA, NA, NA, NA), X182 = c(100L, NA, NA, NA, NA, NA), 
    X183 = c(20L, NA, NA, NA, NA, NA), X184 = c(80L, NA, NA, 
    NA, NA, NA), X185 = c(90L, NA, NA, NA, NA, NA), X186 = c(0L, 
    NA, NA, NA, NA, NA), X187 = c(10L, NA, NA, NA, NA, NA), X188 = c(100L, 
    NA, NA, NA, NA, NA), X189 = c(100L, NA, NA, NA, NA, NA), 
    X190 = c(0L, NA, NA, NA, NA, NA), X19 = c(100L, NA, NA, NA, 
    NA, NA), X191 = c(0L, NA, NA, NA, NA, NA), X192 = c(90L, 
    NA, NA, NA, NA, NA), X193 = c(50L, NA, NA, NA, NA, NA), X194 = c(100L, 
    NA, NA, NA, NA, NA), X195 = c(10L, NA, NA, NA, NA, NA), X196 = c(100L, 
    NA, NA, NA, NA, NA), X197 = c(20L, NA, NA, NA, NA, NA), X198 = c(40L, 
    NA, NA, NA, NA, NA), X199 = c(20L, NA, NA, NA, NA, NA), X200 = c(0L, 
    NA, NA, NA, NA, NA), X20 = c(0L, NA, NA, NA, NA, NA), X201 = c(0L, 
    NA, NA, NA, NA, NA), X202 = c(20L, NA, NA, NA, NA, NA), X203 = c(20L, 
    NA, NA, NA, NA, NA), X204 = c(80L, NA, NA, NA, NA, NA), X205 = c(0L, 
    NA, NA, NA, NA, NA), X206 = c(80L, NA, NA, NA, NA, NA), X207 = c(0L, 
    NA, NA, NA, NA, NA), X2 = c(10L, NA, NA, NA, NA, NA), X21 = c(0L, 
    NA, NA, NA, NA, NA), X22 = c(100L, NA, NA, NA, NA, NA), X23 = c(50L, 
    NA, NA, NA, NA, NA), X24 = c(50L, NA, NA, NA, NA, NA), X25 = c(70L, 
    NA, NA, NA, NA, NA), X26 = c(60L, NA, NA, NA, NA, NA), X27 = c(40L, 
    NA, NA, NA, NA, NA), X28 = c(20L, NA, NA, NA, NA, NA), X29 = c(0L, 
    NA, NA, NA, NA, NA), X30 = c(90L, NA, NA, NA, NA, NA), X3 = c(0L, 
    NA, NA, NA, NA, NA), X31 = c(50L, NA, NA, NA, NA, NA), X32 = c(50L, 
    NA, NA, NA, NA, NA), X33 = c(0L, NA, NA, NA, NA, NA), X34 = c(50L, 
    NA, NA, NA, NA, NA), X35 = c(90L, NA, NA, NA, NA, NA), X36 = c(50L, 
    NA, NA, NA, NA, NA), X37 = c(60L, NA, NA, NA, NA, NA), X38 = c(40L, 
    NA, NA, NA, NA, NA), X39 = c(50L, NA, NA, NA, NA, NA), X40 = c(0L, 
    NA, NA, NA, NA, NA), X4 = c(50L, NA, NA, NA, NA, NA), X41 = c(90L, 
    NA, NA, NA, NA, NA), X42 = c(80L, NA, NA, NA, NA, NA), X43 = c(50L, 
    NA, NA, NA, NA, NA), X44 = c(80L, NA, NA, NA, NA, NA), X45 = c(80L, 
    NA, NA, NA, NA, NA), X46 = c(0L, NA, NA, NA, NA, NA), X47 = c(80L, 
    NA, NA, NA, NA, NA), X48 = c(20L, NA, NA, NA, NA, NA), X49 = c(100L, 
    NA, NA, NA, NA, NA), X50 = c(0L, NA, NA, NA, NA, NA), X5 = c(0L, 
    NA, NA, NA, NA, NA), X51 = c(80L, 100L, 70L, 100L, 0L, 60L 
    ), X52 = c(10L, 0L, 0L, 0L, 0L, 20L), X53 = c(40L, 40L, 70L, 
    20L, 90L, 50L), X54 = c(0L, 10L, 0L, 50L, 50L, 0L), X55 = c(20L, 
    80L, 90L, 80L, 30L, 0L), X56 = c(100L, 100L, 50L, 100L, 80L, 
    100L), X57 = c(60L, 0L, 100L, 70L, 100L, 80L), X58 = c(100L, 
    100L, 100L, 50L, 100L, 100L), X59 = c(80L, 50L, 80L, 0L, 
    30L, 50L), X60 = c(70L, 50L, 60L, 50L, 100L, 100L), X6 = c(100L, 
    NA, NA, NA, NA, NA), X61 = c(50L, 50L, 50L, 30L, 70L, 50L 
    ), X62 = c(20L, 50L, 40L, 40L, 50L, 100L), X63 = c(50L, 0L, 
    100L, 10L, 50L, 100L), X64 = c(60L, 30L, 0L, 50L, 50L, 50L 
    ), X65 = c(50L, 50L, 70L, 80L, 50L, 50L), X66 = c(70L, 40L, 
    10L, 90L, 60L, 50L), X67 = c(30L, 50L, 50L, 0L, 50L, 60L), 
    X68 = c(30L, 0L, 0L, 40L, 70L, 80L), X69 = c(30L, NA, 70L, 
    10L, 0L, 20L), X70 = c(80L, NA, 50L, 50L, 70L, 100L), X7 = c(100L, 
    NA, NA, NA, NA, NA), X71 = c(70L, NA, 50L, 100L, 100L, 100L 
    ), X72 = c(60L, NA, 70L, 50L, 80L, 50L), X73 = c(80L, NA, 
    80L, 80L, 80L, NA), X74 = c(50L, NA, 50L, 0L, 50L, NA), X75 = c(30L, 
    NA, 70L, 10L, 80L, NA), X76 = c(70L, NA, 40L, 80L, 100L, 
    NA), X77 = c(80L, NA, 50L, 100L, 40L, NA), X78 = c(80L, NA, 
    0L, 0L, 0L, NA), X79 = c(80L, NA, 50L, 50L, 50L, NA), X80 = c(40L, 
    NA, 90L, 70L, 60L, NA), X8 = c(50L, NA, NA, NA, NA, NA), 
    X81 = c(70L, NA, 60L, 40L, 80L, NA), X82 = c(80L, NA, 100L, 
    60L, 60L, NA), X83 = c(30L, NA, 100L, 30L, 0L, NA), X84 = c(80L, 
    NA, 0L, 60L, 100L, NA), X85 = c(80L, NA, 50L, 40L, 30L, NA 
    ), X86 = c(50L, NA, 90L, 50L, 50L, NA), X87 = c(80L, NA, 
    50L, 70L, 20L, NA), X88 = c(40L, NA, 70L, 30L, 90L, NA), 
    X89 = c(50L, NA, 50L, 80L, 80L, NA), X90 = c(90L, NA, 100L, 
    60L, 100L, NA), X91 = c(0L, NA, 0L, 0L, 0L, NA), X9 = c(100L, 
    NA, NA, NA, NA, NA), X92 = c(50L, NA, 70L, 90L, 80L, NA), 
    X93 = c(40L, NA, 50L, 50L, 50L, NA), X94 = c(40L, NA, 0L, 
    60L, 40L, NA), X95 = c(90L, NA, 100L, 40L, 50L, NA), X96 = c(50L, 
    NA, 50L, 50L, 50L, NA), X97 = c(60L, NA, 60L, 100L, 50L, 
    NA), X98 = c(40L, NA, 40L, 0L, 0L, NA), X99 = c(30L, NA, 
    0L, 50L, 70L, NA)), .Names = c("X", "X100", "X10", "X1", 
"X11", "X12", "X13", "X14", "X15", "X158", "X159", "X160", "X16", 
"X161", "X162", "X163", "X164", "X165", "X166", "X167", "X168", 
"X169", "X170", "X17", "X171", "X172", "X173", "X174", "X175", 
"X176", "X177", "X178", "X179", "X180", "X18", "X181", "X182", 
"X183", "X184", "X185", "X186", "X187", "X188", "X189", "X190", 
"X19", "X191", "X192", "X193", "X194", "X195", "X196", "X197", 
"X198", "X199", "X200", "X20", "X201", "X202", "X203", "X204", 
"X205", "X206", "X207", "X2", "X21", "X22", "X23", "X24", "X25", 
"X26", "X27", "X28", "X29", "X30", "X3", "X31", "X32", "X33", 
"X34", "X35", "X36", "X37", "X38", "X39", "X40", "X4", "X41", 
"X42", "X43", "X44", "X45", "X46", "X47", "X48", "X49", "X50", 
"X5", "X51", "X52", "X53", "X54", "X55", "X56", "X57", "X58", 
"X59", "X60", "X6", "X61", "X62", "X63", "X64", "X65", "X66", 
"X67", "X68", "X69", "X70", "X7", "X71", "X72", "X73", "X74", 
"X75", "X76", "X77", "X78", "X79", "X80", "X8", "X81", "X82", 
"X83", "X84", "X85", "X86", "X87", "X88", "X89", "X90", "X91", 
"X9", "X92", "X93", "X94", "X95", "X96", "X97", "X98", "X99"), row.names = c(NA, 
6L), class = "data.frame") 

任何瞭解將不勝感激。

從上面小數據集的一些嘗試看來,數字是爲每一行計算的,但是當我返回res對象時,它只是給了我最終的值。我怎樣才能解決這個問題?

回答

14

有兩種方法可以使用apply家族功能。要麼你做

apply(mat, 1, sum, na.rm=TRUE) 
如果你想給函數 sum()適用於每一行

,傳遞更多的參數,如na.rm=TRUE。或者你可以做

apply(mat, 1, foo) 

其中foo()是你自己的功能,定義在外部,例如,

foo <- function(x) sum(x==0, na.rm=TRUE) 

注意,NA處理也可能在

foo2 <- function(x, no.na=TRUE) sum(x==0, na.rm=no.na) 

予以處理函數本身的參數,設置爲TRUE默認值,在上面的定義,你可以把它作爲apply(mat, 1, foo2, no.na=F)雖然它對sum()函數沒有意義(除非要檢查是否有NA值,但在這種情況下最好使用is.na() :-)。

最後,您可以定義功能直接嵌入作爲

apply(mat, 1, function(x) sum(x==0, na.rm=TRUE)) 

在你的情況,這讓我

> apply(mat, 1, function(x) sum(x==0, na.rm=TRUE)) 
1 2 3 4 5 6 
22 4 9 8 7 2 

這相當於apply(ex, 1, foo)

+0

+1解決實際的編碼問題 – Vincent 2011-05-15 20:26:50

+0

你不需要一個匿名函數來申請,你可以使用apply(mat,1,foo,na.rm = TRUE) – mdsumner 2011-05-16 01:15:16

+0

@mdsumner是的,你是對的。我似乎在某個時候混淆了某些事情。但是,因爲我沒有將'na.rm = T'作爲參數(使用默認值)傳遞給'foo()',所以上面的代碼將不起作用。我會更新我的迴應以反映您的優點。 – chl 2011-05-16 06:21:19

4

讓我們打電話給你的數據集dat。您可以使用table()獲取數據集中每個值的頻率表。如果要適用於您的數據幀中的所有數據,將數據強制到一個載體,在產生的向量使用table()

table(do.call('c', dat)) 

這給了你:

> table(do.call('c', dat)) 
    0 1 2 3 4 5 6 10 20 30 40 50 60 70 80 90 100 
52 1 1 1 1 1 1 10 16 21 25 76 19 25 37 14 45 

如果您要檢查各列的頻率,簡單地做:

apply(dat, 1, table) 
3

我試圖解決問題的陳述,而不是在correcitng編碼問題似乎是一個初始部分努力。要計算出現連續數,使用「應用」與「表」

> apply(dfrm, 1, table) 
$`1` 

    0 1 10 20 30 40 50 60 70 80 90 100 
22 1 5 12 14 12 26 7 10 19 7 16 

$`2` 

    0 2 10 30 40 50 80 100 
    4 1 1 1 2 6 1 3 

$`3` 

    0 3 10 40 50 60 70 80 90 100 
    9 1 1 3 13 3 8 3 3 7 

$`4` 

    0 4 10 20 30 40 50 60 70 80 90 100 
    8 1 3 1 3 5 11 4 3 5 2 5 

$`5` 

    0 5 20 30 40 50 60 70 80 90 100 
    7 1 1 3 3 13 3 4 7 2 7 

$`6` 

    0 6 20 50 60 80 100 
    2 1 2 7 2 2 7 

,並請注意這個結果包括作爲一個子集在x == 0的情況下:

> sapply(apply(dfrm, 1, table), function(x) x['0']) 
1.0 2.0 3.0 4.0 5.0 6.0 
22 4 9 8 7 2 
4

對於數據在名爲df data.frame,

sapply(df + 1, tabulate, 101) 

產生的101×151,其中,行對應於一個矩陣0,1,...,100和列151克的樣品;矩陣可能便於後續計算,並且製表比表更快。

相關問題