2016-12-15 44 views
1

我有data.frame列表需要分類到不同的集合。我發現了一些關於如何操縱data.frame列表的文章。不過,我嘗試了SO中的soluion,並且無法使用ggplot2生成堆棧欄圖。我已閱讀了關於ggplot2包的小插曲,學會了如何使用基本功能。點,當我試圖通過其pos.score列分割列表中的每個data.frame結果將成爲嵌套列表。在R中使用嵌套列表是不期望的。有沒有更簡單高效的方法來更清晰地對列表中的data.frame進行分類?如何在分割data.frame之後爲文件欄創建堆棧條圖(我的意思是,對於我指定的每個data.frame對象)?我如何爲ggplot函數提供繪圖數據?有沒有任何有效的方法來做到這一點?這是我的第一篇文章,如果在我的問題上犯了錯誤,請提醒我。非常感謝。如何在將嵌套列表轉換爲data.frame列表後獲取堆棧條圖?

模擬數據:

dfList <- list(
    hotan = data.frame(begin=seq(1, by=6, len=25), end=seq(4, by=6, len=25), pos.score=sample(30, 25)), 
    aksu = data.frame(begin=seq(3, by=9, len=30), end=seq(6, by=9, len=30), pos.score=sample(45, 30)), 
    korla = data.frame(begin=seq(6, by=8, len=45), end=seq(11, by=8, len=45), pos.score=sample(52, 45)) 
) 

羣歸類data.frame

catg <- lapply(myList, function(elm) { 
    res <- split(elm, ifelse(elm$pos.score >=16, "valid", "invalid")) 
}) 

這樣的方式,我得到了嵌套列表,不能期望生成柱狀圖。我正在尋求更優雅的解決方案,如使用tidyr包。我對使用這些軟件包頗爲陌生。我怎樣才能做到這一點?請任何想法嗎?

這是擺脫嵌套列表的討厭的方式,有沒有什麼漂亮的解決方案呢?

unlist(lapply(catg, unlist)) 

編輯

我打算得到data.frame名單如下:

$hotan.valid 
$hotan.invalid 
$aksu.valid 
$aksu.invalid 
$korla.valid 
$korla.invalid 

然後生成文件欄(每個data.frame)堆棧條形圖。我如何輕鬆地做到這一點?這是希望的柱狀圖中的樣機:

desired stack bar plot

我堅持如何產生堆棧條形圖之後我刪除嵌套列表。我怎樣才能達到我想要的文件欄的堆棧欄圖?我怎樣才能更輕鬆地對列表中的每個data.frame進行分類?

+0

stack bar plot的y軸是什麼變量? –

回答

2

下面是使用dplyrggplot2和)的一種方法:

編輯:這裏是一種方法使用plyr包處理dfList

dfList <- list(
    hotan = data.frame(begin=seq(1, by=6, len=25), end=seq(4, by=6, len=25), pos.score=sample(30, 25)), 
    aksu = data.frame(begin=seq(3, by=9, len=30), end=seq(6, by=9, len=30), pos.score=sample(45, 30)), 
    korla = data.frame(begin=seq(6, by=8, len=45), end=seq(11, by=8, len=45), pos.score=sample(52, 45)) 
) 

df <- ldply(dfList) 

library(dplyr) 
library(ggplot2) 
library(plyr) 

df_plot <- 
    df %>% 
    mutate(valid = factor(ifelse(pos.score >= 16, 1, 0))) %>% # if pos.score is greater than or equal to 16, valid = 1, else, valid = 0 
    count(.id, valid) 

ggplot(df_plot, aes(x = .id, y = n, fill = valid)) + 
    geom_col(position = "dodge") 

ggsave("group_valid.png", width = 4, height = 4) 

的關鍵是把所有的數據形成爲一個data.frame,然後count用變量groupvalid進行觀測的頻率。

ggplot-output

+0

保持dfList原樣,所以對此有任何動態解決方案?如果dfList有更多的data.frame需要進行分類,那麼如何獲取列表之外的每個data.frame都是不可取的。有沒有機會讓你的解決方案更具編程性?非常感謝:) – Dan

+0

剛剛添加了一個解決方案,使用'plyr'包可能不是所希望的,但它應該工作正常 –

+0

爲什麼你說使用plyr包是不可取的?另外,我怎樣才能改變x的名字,用其他的東西來標記呢?我怎麼做到的?謝謝 – Dan

相關問題