我有一个数据帧数据,我已使用dcast函数重新整形。 现在我想为每个中心值包含这样的bmi3的人的百分比。所以例如在A列旁边我想要一个Aperc = c列(50,33.33,20) 这里是RE。
我怎么能在R?中做到这一点?
> library(reshape2)
> data =data.frame("centre"=LETTERS[sample(1:10,size=100,replace=T)], "bmi"=sample(1:3,100, replace=T))
> head(data)
centre bmi
1 F 2
2 A 1
3 E 3
4 I 1
5 E 1
6 A 1
> d_edu = dcast(data,bmi~centre)
Using bmi as value column: use value.var to override.
Aggregation function missing: defaulting to length
> d_edu
bmi A B C D E F G H I J
1 1 5 1 2 6 3 5 3 2 4 0
2 2 3 0 1 2 4 8 2 6 6 3
3 3 2 2 2 3 4 6 3 5 5 2
>
答案 0 :(得分:0)
尝试:
d_edu1 <- as.data.frame(matrix(nrow=nrow(d_edu),ncol=(ncol(d_edu)-1)*2+1))
d_edu1[,1] <- d_edu[,1]
d_edu1[,seq(2,ncol(d_edu1), by=2)] <- d_edu[,-1]
d_edu1[,seq(3,ncol(d_edu1), by=2)] <- 100*round(t(t(d_edu[,-1])/colSums(d_edu[,-1])),2)
colnames(d_edu1)[c(1,seq(2,ncol(d_edu1), by=2))] <- colnames(d_edu)
colSums(d_edu1[,seq(3,ncol(d_edu1), by=2)]) ##rounding
# V3 V5 V7 V9 V11 V13 V15 V17 V19 V21
# 100 100 99 101 100 101 100 100 100 99
您可以通过以下方式更改新生成的变量的名称:
colnames(d_edu1)[c(3,seq(2,ncol(d_edu1), by=2))] <- vector_of_names
答案 1 :(得分:0)
你可以使用for循环用这个
填充列 d_edu[,toString(data[i,1]) ]/sum(d_edu[,toString(data[i,1]) ])
答案 2 :(得分:0)
现在您已将BMI值组织成行,prop.table
margin
设置为2,对于列应该在一些格式化和乘法后成功(我在第一次阅读时不明白你想通过列分别做到这一点。)我认为你的例子是错误的,因为中间的百分比值应该是30。
(props_d_edu <- 100*round(prop.table(as.matrix(d_edu[-1]), 2),2) )
# --- different than yours since set.seed() was not called ---------
A B C D E F G H I J
[1,] 43 12 25 50 45 25 33 62 25 43
[2,] 14 50 42 12 36 50 40 12 44 14
[3,] 43 38 33 38 18 25 27 25 31 43
现在通过对非“bmi”列名称进行排序来交错值:
d_edu2 <- cbind(d_edu, props_d_edu)
d_edu2 <- d_edu2[ c("bmi", sort(names(d_edu2)[-1])) ]
d_edu2
#---------------------------
bmi A Aperc B Bperc C Cperc D Dperc E Eperc F Fperc G Gperc H Hperc I Iperc J Jperc
1 1 3 43 1 12 3 25 4 50 5 45 2 25 5 33 5 62 4 25 3 43
2 2 1 14 4 50 5 42 1 12 4 36 4 50 6 40 1 12 7 44 1 14
3 3 3 43 3 38 4 33 3 38 2 18 2 25 4 27 2 25 5 31 3 43
>
答案 3 :(得分:0)
试
d_edu$Aperc <- d_edu$A/sum(d_edu$A)
d_edu$Bperc <- d_edu$B/sum(d_edu$B)
等等
然后
d_edu = d_edu[c( "bmi", "A", "Aperc", "B", "Bperc", ..............)]