我的数据被拆分为几个表。在这些表格中,我发现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.frame
的list
,用sapply
在list
上循环,用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