计算数据框中数字和分类变量的百分比
Calculating percentages for numeric and categorical variables in a data frame
我有一个数据 table,其中包含不同 类 的各种数值和分类变量。我需要以一种方式转换我的数据,最终每个变量都有一个不同的数据框,在第一列中有为该变量记录的每个值,其他列显示每个 类 每个值在各自数据集中的百分比。所以每一列都是 类 之一,加起来应该是 100。我用 dput()
函数准备了示例。
我的数据是什么样的
structure(list(ï..class = structure(c(1L, 2L, 1L, 3L, 3L, 4L,
3L), .Label = c("A", "B", "C", "D"), class = "factor"), var01 = c(150L,
70L, 70L, 60L, 220L, 10L, 85L), var02 = c(50L, 30L, 50L, 30L,
120L, 30L, 35L), var03 = c(1L, 1L, 1L, 1L, 5L, 8L, 3L), var04 = c(1L,
0L, 1L, 0L, 0L, 1L, 0L), var05 = c(2L, 1L, 1L, 0L, 0L, 3L, 0L
)), class = "data.frame", row.names = c(NA, -7L))
Var01、Var02 和 Var03 是数字,Var04 和 Var05 在这个例子中是分类的。
每个变量都需要它
structure(list(ï..var01 = c(10L, 60L, 70L, 85L, 150L, 220L),
A = c(0, 0, 50, 0, 50, 0), B = c(0, 0, 100, 0, 0, 0), C = c(0,
33.34, 0, 33.34, 0, 33.34), D = c(100, 0, 0, 0, 0, 0)), class = "data.frame",
row.names = c(NA, -6L))
我尝试了几种方法自己做,但鉴于我对 R 的不是很好,我丝毫没有成功。
干杯,
亚历克斯
你可以试试这个:
library(reshape2)
d2 <- dcast(d, var01 ~ iclass, fun.aggregate = length)
d2[,-1] <- 100 * d2[,-1]/colSums(d2[,-1])[col(d2[,-1])]
结果:
> d2
var01 A B C D
1 10 0 0 0.00000 100
2 60 0 0 33.33333 0
3 70 50 100 0.00000 0
4 85 0 0 33.33333 0
5 150 50 0 0.00000 0
6 220 0 0 33.33333 0
使用的数据
d <- structure(list(iclass = structure(c(1L, 2L, 1L, 3L, 3L, 4L, 3L), .Label = c("A", "B", "C", "D"), class = "factor"),
var01 = c(150L, 70L, 70L, 60L, 220L, 10L, 85L), var02 = c(50L, 30L, 50L, 30L, 120L, 30L, 35L),
var03 = c(1L, 1L, 1L, 1L, 5L, 8L, 3L), var04 = c(1L, 0L, 1L, 0L, 0L, 1L, 0L),
var05 = c(2L, 1L, 1L, 0L, 0L, 3L, 0L)), class = "data.frame", row.names = c(NA, -7L))
我有一个数据 table,其中包含不同 类 的各种数值和分类变量。我需要以一种方式转换我的数据,最终每个变量都有一个不同的数据框,在第一列中有为该变量记录的每个值,其他列显示每个 类 每个值在各自数据集中的百分比。所以每一列都是 类 之一,加起来应该是 100。我用 dput()
函数准备了示例。
我的数据是什么样的
structure(list(ï..class = structure(c(1L, 2L, 1L, 3L, 3L, 4L,
3L), .Label = c("A", "B", "C", "D"), class = "factor"), var01 = c(150L,
70L, 70L, 60L, 220L, 10L, 85L), var02 = c(50L, 30L, 50L, 30L,
120L, 30L, 35L), var03 = c(1L, 1L, 1L, 1L, 5L, 8L, 3L), var04 = c(1L,
0L, 1L, 0L, 0L, 1L, 0L), var05 = c(2L, 1L, 1L, 0L, 0L, 3L, 0L
)), class = "data.frame", row.names = c(NA, -7L))
Var01、Var02 和 Var03 是数字,Var04 和 Var05 在这个例子中是分类的。
每个变量都需要它
structure(list(ï..var01 = c(10L, 60L, 70L, 85L, 150L, 220L),
A = c(0, 0, 50, 0, 50, 0), B = c(0, 0, 100, 0, 0, 0), C = c(0,
33.34, 0, 33.34, 0, 33.34), D = c(100, 0, 0, 0, 0, 0)), class = "data.frame",
row.names = c(NA, -6L))
我尝试了几种方法自己做,但鉴于我对 R 的不是很好,我丝毫没有成功。
干杯,
亚历克斯
你可以试试这个:
library(reshape2)
d2 <- dcast(d, var01 ~ iclass, fun.aggregate = length)
d2[,-1] <- 100 * d2[,-1]/colSums(d2[,-1])[col(d2[,-1])]
结果:
> d2
var01 A B C D
1 10 0 0 0.00000 100
2 60 0 0 33.33333 0
3 70 50 100 0.00000 0
4 85 0 0 33.33333 0
5 150 50 0 0.00000 0
6 220 0 0 33.33333 0
使用的数据
d <- structure(list(iclass = structure(c(1L, 2L, 1L, 3L, 3L, 4L, 3L), .Label = c("A", "B", "C", "D"), class = "factor"),
var01 = c(150L, 70L, 70L, 60L, 220L, 10L, 85L), var02 = c(50L, 30L, 50L, 30L, 120L, 30L, 35L),
var03 = c(1L, 1L, 1L, 1L, 5L, 8L, 3L), var04 = c(1L, 0L, 1L, 0L, 0L, 1L, 0L),
var05 = c(2L, 1L, 1L, 0L, 0L, 3L, 0L)), class = "data.frame", row.names = c(NA, -7L))