2017-08-17 22 views
-2
library(tidyverse) 

我想用dplyr,tidyr和purrr在Tidyverse語法中重寫下面的for循環代碼。重寫一個For循環,計算百分比列時,總成一排使用Tidyverse

for (i in seq_along(Data3)) { 
Data3[[i]]$Count <- as.numeric(Data3[[i]]$Count) 
n <- nrow(Data3[[i]]) 
Data3[[i]]$perc <- Data3[[i]]$Count/Data3[[i]]$Count[n] 
} 

的樣本數據如下:

Loc<-c("Montreal","Toronto","Vancouver","Quebec","Ottawa","Hamilton","Total") 
Count<-c("2344","2322","122","45","4544","44","9421") 

Data<-data_frame(Loc,Count) 
Data2<-data_frame(Loc,Count) 
Data3<-list(Data,Data2) 

這就是我想要實現:

每個數據幀都有「總計」與相應的總總的「祿」列中「計數」列。我想通過將「計數」列中的每個值除以總計(即「計數」列中的最後一個數字)來計算每個數據幀的百分比。

我想百分比作爲每個數據框的新列添加。 對於本示例,總數是列中的最後一個數字,但實際上,它可以在列中的任意位置混合,並可通過「Loc」列中相應的「總計」值找到。

我一直在玩使用purrr :: map,但我不知道如何計算百分比。

Data3%>%map(~mutate(.x,paste0(round(100* (MISSING PERCENTAGE),2),"%")) 
+0

這個網站是不是'寫我的代碼'的問題。你已經嘗試過什麼,什麼不起作用,或者你卡在哪裏? –

+0

我爲代碼添加了一個我想到的例子,但是我真的被困在百分比計算中。我試圖尋找其他職位,但找不到任何東西。 – Mike

回答

0

我會用基礎R:

首先確保您的數據有祿爲字符,而不是因素:

Loc<-c("Montreal","Toronto","Vancouver","Quebec","Ottawa","Hamilton","Total") 
Count<-c(2344,2322,122,45,4544,44,9421) 

Data<-data.frame(Loc,Count,stringsAsFactors = F) 

Data3<-list(Data,Data) 

lapply(Data3,function(x) {x[,"Percentage"]=100*x[,2]/x[x[,1]=="Total",2];x}) 


[[1]] 
     Loc Count Percentage 
1 Montreal 2344 24.8805859 
2 Toronto 2322 24.6470651 
3 Vancouver 122 1.2949793 
4 Quebec 45 0.4776563 
5 Ottawa 4544 48.2326717 
6 Hamilton 44 0.4670417 
7  Total 9421 100.0000000 

[[2]] 
     Loc Count Percentage 
1 Montreal 2344 24.8805859 
2 Toronto 2322 24.6470651 
3 Vancouver 122 1.2949793 
4 Quebec 45 0.4776563 
5 Ottawa 4544 48.2326717 
6 Hamilton 44 0.4670417 
7  Total 9421 100.0000000 

沒有相當大的map之間purrMap在基地R.差異如果你的目標是確實使用map。然後我可以給一個尖端象下面這將給與上述相同的溶液中,邏輯可以幾乎相似:

Data3%>%map(~mutate(.x,'%'=100*Count/Count[Loc=="Total"])) 

我用%sighn ..我可以寫百分比...

希望這會有所幫助

0

如果你想保留「總計」行,這將執行你的任務。但是,在單個列中混合不同類型的值對於您的數據來說是非常不整齊的形式。繼續需要您自擔風險。

Data %>% 
    mutate(Count_type = ifelse(Loc == "Total", "Total", "Component") %>% 
    group_by(Count_type) %>% 
    mutate(Count_pct = Count/sum(Count)) 

更好的解決方案是簡單地去掉「總計」行,因爲只要你的願望,他們可以很容易地計算爲一個額外的列。

Data %>% 
    filter(Loc != "Total") %>% 
    mutate(Count_pct = Count/sum(Count)) 

至於Data3,在那裏你存儲在一個列表中dataframes理由嗎?你說得對,purrr可以解決這個問題,但也有更簡單的方法:

Data3 <- bind_rows("Data" = Data, "Data2" = Data2, .id = "Source") %>% group_by(Source) 

然後剛剛替補Data3作爲上述任一管道的開始。

如果您使用的是列表,因爲您的數據由於某種原因以列表形式發送給您,您的map代碼已接近正確。您應該能夠弄清楚如何使用這些片段來處理數據框列表。