library(tidyverse)
我想使用dplyr,tidyr和purrr在Tidyverse语法中重写下面的for循环代码。
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)
这就是我想要实现的目标:
每个数据框都有&#34; Total&#34;在&#34; Loc&#34;列与对应的总数&#34;计数&#34;柱。我想通过除以&#34; Count&#34;中的每个值来计算每个数据帧的百分比。列总数,这是&#34;计数&#34;中的最后一个数字。柱。
我希望将百分比添加为每个数据框的新列。 对于此示例,总数是列中的最后一个数字,但实际上,它可以在列中的任何位置混合,并且可以通过相应的&#34; Total&#34; &#34; Loc&#34;中的值柱。
我一直在使用purrr :: map,但我不确定如何计算百分比。
Data3%>%map(~mutate(.x,paste0(round(100* (MISSING PERCENTAGE),2),"%"))
答案 0 :(得分: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
而言,是否有理由将数据帧存储在列表中?你purrr
可以解决这个问题是对的,但有更简单的方法:
Data3 <- bind_rows("Data" = Data, "Data2" = Data2, .id = "Source") %>% group_by(Source)
然后将Data3
替换为上述任一管道的开头。
如果您使用的是列表,因为您的数据由于某些原因而作为列表出现,那么您的map
代码就会接近正确。您应该能够弄清楚如何使用这些代码段来处理数据帧列表。
答案 1 :(得分:0)
我将使用基数R:
首先确保您的数据将Loc作为字符而不是因素:
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
,则purr
中的Map
与基地R中的map
之间没有太大区别。然后我可以给出如下所示的提示,它将提供与上述相同的解决方案,逻辑几乎相似:
Data3%>%map(~mutate(.x,'%'=100*Count/Count[Loc=="Total"]))
我使用%sighn ..我可以写百分比......
希望这会有所帮助