如何计算已经在for循环中使用lapply分割的数据帧中的值的比率



我的数据被拆分为几个表。在这些表格中,我发现A、B、C、D出现了多少次。以下是我想要的输出:-https://docs.google.com/spreadsheets/d/1lAyaWEDE3WYYEj5pR0iYy1E7JweIO_KIV8OLkxqc1LE/edit#gid=0

我创建了这个函数(我在下面解释了它的作用,我还使用dput((附加了我的数据,我还附加了一个电子表格,显示了输出的样子(:-

u<- c("D", "B", "C", "A")
for (i in u) {
print(data.frame(sapply(split(final,Q), function(x) sum(x == i, na.rm = TRUE))))

}

我有两个变量->'u和final。我想看看u(A,B,C,D(中的每个字符在我的"最终"(变量名称(矩阵中出现了多少次,这个矩阵被分成了几个部分(继续阅读以获得进一步的解释(。所以我创建了一个for循环。在循环中,我创建了一个函数来计算"u"(a,B,C,D(的每个元素在"最终"矩阵中出现的次数。该函数使用==将整个数据帧强制为逻辑矩阵,然后使用sum((将TRUE值(即1(相加。这给了我"u"(A,B,C,D(在"final"中出现的次数。

我还有一个函数,它根据最终矩阵中的一列Q(它是结束列(来拆分我的"最终"矩阵。

我得到的输出如下:-

sapply.split.final..Q...function.x..sum.x....i..na.rm...TRUE..
1                                                            191
2                                                            310
3                                                            127
4                                                            152
sapply.split.final..Q...function.x..sum.x....i..na.rm...TRUE..
1                                                            217
2                                                            361
3                                                            121
4                                                            168
sapply.split.final..Q...function.x..sum.x....i..na.rm...TRUE..
1                                                            236
2                                                            373
3                                                            136
4                                                            204
sapply.split.final..Q...function.x..sum.x....i..na.rm...TRUE..
1                                                            142
2                                                            320
3                                                            136
4                                                            226

这接近我想要的。我想根据列Q将数据分成几个部分,并计算每个元素"u"在每个拆分的表中出现的次数。

不过,我想稍微修改一下这个表。我想看到每个拆分表中每个值的比率,而不是像这个那样的值本身

final<-structure(list(X70 = c("D", "A", "D", "D", "D", "D", "D", "D", 
"D", "B", "B", "D", "A", "D", "D", "C", "D", "C", "D", "D", "D", 
"D", "D", "D", "B", "D", "D", "D", "D", "D", "D", "D", "D", NA, 
"D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", 
"D"), X71 = c("A", "B", NA, "A", "B", "C", "A", "B", "B", "B", 
"C", "C", "C", "D", "A", "A", "C", "D", "C", "C", "C", "B", "C", 
"A", "C", "C", NA, "D", "B", "C", "A", "C", "B", "C", "C", "C", 
"C", "A", "D", "C", "A", "B", "B", "D", "C", "C", "C", "C"), 
X72 = c("B", "B", "C", "D", "C", "D", "C", "A", "C", "A", 
"A", "C", "C", NA, "A", "C", "B", "B", "A", "C", "D", "C", 
NA, "C", "C", NA, "C", "C", "B", "A", "B", "C", "C", "C", 
"D", "C", "D", "B", "C", "A", "D", "C", "B", "B", NA, "B", 
NA, "A"), X73 = c(NA, NA, "D", "B", "D", "D", "D", "B", "D", 
"C", "C", "C", "C", "C", "B", "D", "B", "A", "D", "C", "D", 
"D", "B", "D", "C", NA, "D", "A", "A", "A", "D", "A", "B", 
"D", "C", "B", NA, "C", "C", "D", "D", "C", "A", "B", NA, 
"A", "A", "C"), X74 = c("C", NA, "A", "D", "C", "B", "C", 
"B", "D", "A", "D", "C", "C", "D", "C", "B", "D", "B", "A", 
"D", "C", "C", "C", "C", "B", "B", "D", NA, NA, "D", "A", 
"B", "D", "B", "D", "A", NA, "D", "C", "A", "D", "C", "D", 
"A", NA, "D", "D", "D"), X75 = c("C", NA, "C", "B", "C", 
"C", "C", "C", "C", "C", "C", "B", "C", "B", NA, "C", "C", 
"D", "C", "C", "B", "C", "C", "C", "D", "C", "D", "C", "C", 
"C", "C", "C", "A", "C", "C", "B", "C", "C", "B", "C", "C", 
"C", "C", "D", "C", "D", "C", "C"), X76 = c("D", NA, "D", 
"A", "D", "D", "D", "D", "D", "A", "D", "D", "D", "A", NA, 
"D", "B", "B", "A", "D", "D", "A", "D", "D", "D", "D", "C", 
"D", "D", "D", "D", "D", "A", "D", "A", "D", "D", "D", "D", 
"D", "D", "A", "D", "D", "B", "D", "D", "A"), X77 = c(NA, 
NA, "B", "B", "B", "D", "D", "D", "B", "C", "B", "B", "B", 
"B", NA, "B", "B", "B", "C", "B", "D", "B", NA, "B", "B", 
"B", "C", "B", "A", "B", "B", NA, "B", NA, "B", "C", "B", 
"B", "B", "B", "D", "C", "B", "D", "D", "D", NA, "C"), X78 = c("C", 
NA, "C", "C", "D", "C", "C", "B", "C", "C", "B", "C", "C", 
"C", NA, "D", "B", "B", "C", "B", "C", "C", "A", "A", "A", 
"B", "A", "C", "A", "C", "C", "B", "B", "D", "A", "C", "D", 
"C", "C", "A", "C", "C", NA, "C", NA, "C", "C", "C"), X79 = c("D", 
NA, "D", "A", "D", "D", "A", "C", "D", "C", "D", NA, "D", 
"D", NA, "D", NA, NA, "B", "D", "A", NA, "D", "A", "D", "A", 
"A", "A", "A", "D", "D", "D", "A", "A", "D", "D", "D", "A", 
"B", "D", "D", "A", NA, "A", "D", "D", "C", "C"), X80 = c("C", 
NA, "C", NA, "C", "C", "C", "B", "C", "A", "A", NA, "C", 
"C", NA, "C", NA, NA, "D", "C", "C", NA, NA, "C", "B", "B", 
"C", "B", "C", "C", "C", "C", NA, "C", "B", "C", "C", "C", 
"C", "C", "B", "C", NA, "C", "A", "C", "C", "A"), s = c(17, 
16, 22, 18, 19, 20, 23, 18, 19, 17, 10, 12, 18, 17, 20, 13, 
11, 14, 22, 18, 16, 16, 17, 21, 17, 13, 15, 13, 22, 22, 18, 
7, 13, 21, 23, 19, 18, 20, 14, 24, 19, 13, 13, 18, 11, 13, 
18, 26), Q = c(2, 2, 4, 2, 3, 3, 4, 2, 3, 2, 1, 1, 2, 2, 
3, 1, 1, 2, 4, 2, 2, 2, 2, 4, 2, 1, 2, 1, 4, 4, 2, 1, 1, 
4, 4, 3, 2, 3, 2, 4, 3, 1, 1, 2, 1, 1, 2, 4)), row.names = c(NA, 
-48L), class = "data.frame")

编辑:我的输出和你的输出可能看起来有点不同,因为我对数据做了一点更改。

如果我们是按"Q"排序的split,则选择startsWith‘X’、split按"Q’排序的列为data.framelist,用sapplylist上循环,用table获取unlist数据的频率计数,并转换为proportions

out <- sapply(split(final[startsWith(names(final), "X")], 
final$Q), function(x) proportions(table(unlist(x))))

-输出

out
1         2          3          4
A 0.1293103 0.1297297 0.08450704 0.22641509
B 0.2586207 0.2108108 0.15492958 0.09433962
C 0.3189655 0.3459459 0.33802817 0.36792453
D 0.2931034 0.3135135 0.42253521 0.31132075

如果我们想进行plot,请使用matplot

matplot(t(out), type = 'l', col = 1:4, xaxt = 'n')
axis(side=1, at=1:4, labels=colnames(out))
legend("topleft", legend = row.names(out), fill = 1:4)

您也可以执行此

library(dplyr)
library(tidyr)
final_l <- final %>% 
pivot_longer(values_to = "Letters_f",
cols = starts_with("X")) 
prop.table(  table(final_l$Q, final_l$Letters_f), margin = 1)
A          B          C          D
1 0.12931034 0.25862069 0.31896552 0.29310345
2 0.12972973 0.21081081 0.34594595 0.31351351
3 0.08450704 0.15492958 0.33802817 0.42253521
4 0.22641509 0.09433962 0.36792453 0.31132075

最新更新