2014-09-20 48 views
3

這是我的第一篇文章,我對編程和R非常陌生,所以請原諒任何愚蠢。統計多個變量的因子水平的發生並在一個表中統計結果

我有以下數據幀:

a <- data.frame("sickness1" = c(1,1,2,3,3,5,6, 4, 4, 4), 
       "sickness2" = c(NA, NA, 3, 3, 4, 6, 1, 2, 5, 6), 
       "sickness3" = c(NA, NA, 3, 4, 4, 6, 1, 2, 5, 6), 
       "sickness4" = c(NA, NA, 6, 3, 4, 6, 1, 2, 5, 6)) 

每一行代表一個案件。每列是一個有序因子變量。我改變了變量,像這樣的因素(使用的提示,我的計算器找到了!):

a[] <- lapply(a, factor, 
      levels = c(1:6), 
      labels = c(3, 25, 50, 75, 97, 100)) 

我想獲得以下輸出:

percent sickness1   sickness2 sickness3  sickness4 
1  3   1    1   1   2 
2  25   1    1   1   1 
3  50   2    1   1   2 
4  75   1    2   1   3 
5  97   1    1   1   1 
6  100   2    2   3   1 

我已經找到了解決辦法,這是非常longwinded:

# counting 
ab <- ldply(lapply(a, count)) 

#getting it into the right format 
ab2 <- dcast(
    data = ab, 
    formula = x ~ .id, 
    value.var = "freq") 

# changing the name of the first column 
colnames(ab2)[1] <- "percent" 

#deleting row 7 cause it contains the NAs which I dont want to have 
ab2 <- ab2[-7,] 
ab2 

有沒有更快更簡單的方法來做到這一點?就像在某些方面使用ddply一樣? 總結(a)給我的輸出太亂了,我不知道如何操作它來看看我想要的樣子。另外我一起工作的真正的數據是這樣大,我必須做這樣的事情很多次....

+0

我想這會,一般是有更多的幫助這樣的數據在2列「data.frame」(這裏[病態百分比]);那麼你可以調用'table(mydataframe)'。例如。 'table(data.frame(pct = c(5,10,15,10,15,5,10,10,20,25),sickness = c(1,1,1,2,2,3,4, 4,4,4)))' – 2014-09-20 20:25:09

+0

您建議infromation丟失的形式。什麼是可能的是一個3列長的數據格式,所以值的另一列,然後再次它不工作與表(mydataframe)。更多地解釋實際數據,每一行都是一個機構,例如一家醫院,百分比是百分比範圍,每個機構評估他們的病人有多少患病1,疾病2等等 – grrgrrbla 2014-09-20 20:57:01

+0

我看到;但是(除非內存是問題)像'reshape(a,direction =「long」,vary = list(1:4),sep =「」,times = names(a))這樣的「data.frame」可以存儲必要的信息,很容易操縱。 (在這種情況下,您必須明確聲明調用'table'內的兩列)。我希望我不會誤解你的意思 – 2014-09-20 21:22:01

回答

0

你可以試試:

un1 <- as.character(sort(unique(unlist(a, use.names=FALSE)))) 
data.frame(percent=un1,do.call(cbind, 
      lapply(a, function(x) table(factor(x, levels=un1))))) 
+0

非常感謝!非常優雅的解決方案。剛開始時我很難理解,但和平解開了我的和平我知道了。現在學習了一些新的功能,即使我看完一些後仍然不明白do.call。我會等到我接受你的答案之前,因爲我想聽聽其他解決方案:)。希望多數民衆贊成 – grrgrrbla 2014-09-20 20:38:40

+0

@grrgrrbia是的,沒關係。我使用的'a'是在'a [] < - lapply(a,factor,..)'步之後。我認爲這一步也可以避免。 – akrun 2014-09-20 20:40:32

1

好了,所以我發現有兩個可能的解決方案:

Nr1時由akrun:

un1 <- as.character(sort(unique(unlist(a, use.names=FALSE)))) 
data.frame(percent=un1,do.call(cbind, 
      lapply(a, function(x) table(factor(x, levels=un1))))) 

NR 2由alexis_laz:

給我è asily使數據看起來像這樣:(這僅僅是一個數據幀與列增加了對機構上文)

a <- data.frame("institution" = c(1:10), "sickness1" = c(1,1,2,3,3,5,6, 4, 4, 4), 
       "sickness2" = c(NA, NA, 3, 3, 4, 6, 1, 2, 5, 6), 
       "sickness3" = c(NA, NA, 3, 4, 4, 6, 1, 2, 5, 6), 
       "sickness4" = c(NA, NA, 6, 3, 4, 6, 1, 2, 5, 6)) 

a[-1] <- lapply(a[-1], factor, 
       levels = c(1:6), 
       labels = c("0 to 3%","4-25%", "25-50%", "51-75%","76-97%","97-100%")) 

我能然後轉換此範圍內的數據形成爲這樣的長的數據格式:

b2 <- melt(a, id.vars = "institution") 

那麼普通表功能的工作原理:

table(b2[[3]], b2[[2]]) 

注意,訂貨事宜

非常感謝你們!

1

這主要是一個主題類型答案的變體。使用stacktable在一起,就像這樣:

as.data.frame.matrix(   ## converts the output to a data.frame 
    table(      ## does the actual tabulation 
    stack(      ## stack makes your data.frame long 
     lapply(a, as.character)), ## but won't work with factors; convert to char 
     useNA = "no")   ## we don't want NA values 
     )[levels(a[[1]]), ]  ## We want our rows in a nicer order 
#  sickness1 sickness3 sickness4 sickness5 
# 3   2   1   1   1 
# 25   1   1   1   1 
# 50   2   2   1   1 
# 75   3   1   2   1 
# 97   1   1   1   1 
# 100   1   2   2   3 

另外,這裏的 「dplyr」 + 「tidyr」 的方法:

library(dplyr) 
library(tidyr) 

a %>% gather(var, val, sickness1:sickness5) %>%  ## make the data long 
    mutate(val = factor(val, levels(unlist(a)))) %>% ## refactor "val" column 
    rev %>%       ## reverse the order of val and var 
    table %>%      ## make your table 
    as.data.frame.matrix   ## convert it to a data.frame 

#  sickness1 sickness3 sickness4 sickness5 
# 3   2   1   1   1 
# 25   1   1   1   1 
# 50   2   2   1   1 
# 75   3   1   2   1 
# 97   1   1   1   1 
# 100   1   2   2   3 
+0

非常感謝!特別是對於解釋!只有一個部分我不明白,那是'(。)'是什麼意思?這是否意味着「使用之前的行輸出」?這是基礎包還是其他包的參數部分?並且只有一個小錯誤:在'gather()'參數中,列是'sickness1:sickness4''''' sickness5' – grrgrrbla 2014-09-21 10:52:25

+0

@grrgrrbla,'.'是指數據集直到評估點的簡寫。我編輯了答案,以顯示如何在沒有'.'的情況下工作。此外,「聚集」的錯誤是你的 - 不是我的。請檢查您的實際問題,看看我的意思。 – A5C1D2H2I1M1N2O1R2T1 2014-09-22 04:51:54

+0

你是對的,斯里。我只是修復了這個問題。非常感謝,學到了更多有用的東西! – grrgrrbla 2014-09-22 08:50:19

相關問題