尝试在拆分函数后添加一个 % 列。
编写了以下有效的代码:
percs <- function(agg, deporur=0, all=TRUE, full=FALSE){
work <- data.frame(NoNA$IMD_NATIONAL_QUINTILE, NoNA$UR,agg)
work <- as.data.frame(table(work))
work <-split(work, work[,deporur])
work
}
根据我的数据,返回:
$`1`
NoNA.IMD_NATIONAL_QUINTILE NoNA.UR agg Freq
1 1 0 1 0
6 1 Rural 1 0
11 1 Urban 1 43
16 1 0 2 0
21 1 Rural 2 0
26 1 Urban 2 37
$`2`
NoNA.IMD_NATIONAL_QUINTILE NoNA.UR agg Freq
2 2 0 1 0
7 2 Rural 1 3
12 2 Urban 1 30
17 2 0 2 0
22 2 Rural 2 1
27 2 Urban 2 27
$`3`
NoNA.IMD_NATIONAL_QUINTILE NoNA.UR agg Freq
3 3 0 1 0
8 3 Rural 1 7
13 3 Urban 1 25
18 3 0 2 0
23 3 Rural 2 3
28 3 Urban 2 13
$`4`
NoNA.IMD_NATIONAL_QUINTILE NoNA.UR agg Freq
4 4 0 1 0
9 4 Rural 1 9
14 4 Urban 1 30
19 4 0 2 0
24 4 Rural 2 0
29 4 Urban 2 18
$`5`
NoNA.IMD_NATIONAL_QUINTILE NoNA.UR agg Freq
5 5 0 1 0
10 5 Rural 1 13
15 5 Urban 1 40
20 5 0 2 0
25 5 Rural 2 11
30 5 Urban 2 27
我想在每个的末尾添加一个额外的列来显示每个的百分比。
我可以让它在控制台中工作,如下所示:
test<-percs(NoNA$Q1, 1)
test$"1"$newcol <- test$"1"[,4]/sum(test$"1"[,4])
test$"1"
NoNA.IMD_NATIONAL_QUINTILE NoNA.UR agg Freq newcol
1 1 0 1 0 0.0000
6 1 Rural 1 0 0.0000
11 1 Urban 1 43 0.5375
16 1 0 2 0 0.0000
21 1 Rural 2 0 0.0000
26 1 Urban 2 37 0.4625
但是,我不知道如何让它循环工作,遍历存储在工作数据框中的每个数据框并添加一个额外的列。如果我使用 $ 运算符访问对象,那么它允许我使用数据框,但是使用 [] 运算符就像我通常在 for 循环中那样,它返回列表并且不允许我添加列。
关于我在这里哪里出错有什么想法吗?
最佳答案
这是一个关于测试数据的简单版本
df <- expand.grid(type=1:10, qty=1:5)
split(df, df$type)
$`1`
type qty
1 1 1
11 1 2
21 1 3
31 1 4
41 1 5
$`2`
type qty
2 2 1
12 2 2
22 2 3
32 2 4
42 2 5
...
然后要计算百分比,您可以使用 lapply
> lapply(split(df, df$type), function(d) { d$asdf <- cumsum(d$qty)/sum(d$qty); d })
$`1`
type qty asdf
1 1 1 0.06666667
11 1 2 0.20000000
21 1 3 0.40000000
31 1 4 0.66666667
41 1 5 1.00000000
$`2`
type qty asdf
2 2 1 0.06666667
12 2 2 0.20000000
22 2 3 0.40000000
32 2 4 0.66666667
42 2 5 1.00000000
...
关于r - 拆分后应用新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31880315/