我正在使用包含多个包含类似信息的变量的大型数据集。变量范围从PR1到PR25。每个都包含有关过程代码的信息。简而言之,数据框如下所示:
Obs PR1 PR2 PR3
1 527 1422 222
2 1600 527 569
3 341 222 341
4 222 569 1422
5 569 341 1660
PR1至PR25值是因子。
我正在寻找一种方法来建立所有这些变量的信息表。例如,我想创建一个表格,显示PR1:PR25的值总数“527”。我想为多个感兴趣的值做这件事。
例如
PR Tot
#222 3
#341 3
#527 2
#569 3
#1600 1
#1660 1
但是,我只想检索一组非常具体的值的频率,例如仅提取527
或1600
的频率。
我最初尝试使用像length(which(PR1=="527"))
这样的简单函数,但这种函数很有用,但很乏味。
我使用了Soren建议的方法:
library(plyr)
all_codes <- data.frame(codes=unlist(lapply(df,levels),use.names=F))
result <- ddply(all_codes,.(codes),summarize,count=length(codes))
result[which(result$codes %in% c("527", "5251", "5252", "5253", "5259",
"526", "521", "529", "8512", "8521", "344", "854", "8523", "8541", "8546",
"8542", "8547" , "8544", "8545", "8543", "639",
"064","065","063","0650","0651", "0652", "062", "066", "4040", "4041",
"4042", "0721", "0712","0701", "0702", "070", "0741", "435","436", "4399",
"439", "438", "437", "4381", "4391", "4342", "5122", "5121", "5124", "5123",
"518", "519", "503", "5022", "5012")),]
得到以下输出(缩写):
codes count
92 062 5
95 064 8
96 0650 2
769 526 8
770 527 8
然而,我有一种不正确的感觉。我根据sapply(df, function(PR1) length(which(PR1 == "527")))
的输出检查了它
我得到以下内容:
PR1 PR2 PR3 PR4 PR5 PR6 PR7 PR8 ...
1152 36 6 1 2 1 1 1
数据框中“527”个案的正确数量是多少。为什么第一种方法给出不正确的因子水平总和的任何建议? 感谢您的帮助,如果我能提供更多信息,请告知我们
答案 0 :(得分:0)
您可以使用sapply()
或lapply()
函数计算所有列的某个值。
创建数据框df
df <- data.frame(A = 1:4, B = c(4,4,4,4), C = c(2,3,4,4), D = 9:12)
df
# A B C D
# 1 1 4 2 9
# 2 2 4 3 10
# 3 3 4 4 11
# 4 4 4 4 12
使用sapply()
函数的每列A,B,C和D中的值“4”的频率
sapply(df, function(x) length(which(x == 4)))
A B C D
1 4 2 0
使用lapply()
函数的每列A,B,C和D中的值“4”的频率
lapply(df, function(x) length(which(x == 4)))
# $A
# [1] 1
# $B
# [1] 4
# $C
# [1] 2
# $D
# [1] 0
答案 1 :(得分:0)
以下以您的示例为例,返回可在所有25列中进行推广的输出。 &#34; plyr&#34;库用于创建聚合计数
脚本如下:
library(plyr)
df <- data.frame(PR1=c("527","1600","341","222","569"),PR2=c("1422","527","222","569","341"),PR3=c("222","569","341","1422","1660"),stringsAsFactors = T)
all_codes <- data.frame(codes=unlist(lapply(df,levels),use.names=F))
result <- ddply(all_codes,.(codes),summarize,count=length(codes))
result[which(result$codes %in% c('527','222')),]
解释如下:
按照上面的说明创建数据框。由于OP指出的值是因子,stringsAsFactors设置为TRUE
df <- data.frame(
PR1=c("527","1600","341","222","569"),
PR2=c("1422","527","222","569","341"),
PR3=c("222","569","341","1422","1660"),
stringsAsFactors = T)
审查df的结果
df
PR1 PR2 PR3
1 527 1422 222
2 1600 527 569
3 341 222 341
4 222 569 1422
5 569 341 1660
当OP要求将所有代码组合在PR1:PR25上时,通过使用lapply循环遍历所有列,将这些代码统一到一个列表中。但是,由于这些是因素 - 并且似乎对因子的级别值感兴趣而不是其基础数字表示,lapply(df,levels)返回这些值。要合并到单个列表PR1:PR25中,它只是unlist(),并且因为列名在这种情况下似乎没用,所以use.names设置为FALSE。最后,使用名为codes的单列创建data.frame,稍后将其输入ddply()函数以获取计数。
all_codes <- data.frame(codes=unlist(lapply(df,levels),use.names=F))
all_codes
codes
1 1600
2 222
3 341
4 527
5 569
6 1422
7 222
8 341
9 527
10 569
11 1422
12 1660
13 222
14 341
15 569
Uisng ddply()在df $ codes值上拆分()data.frame,然后在ddply()
中获取split返回的每个向量的length()result <- ddply(all_codes,.(codes),summarize,count=length(codes))
result
查看结果给出PR1:PR25聚合原始数据中每个因子的所有等级值的计数。框架
codes count
1 1422 2
2 1600 1
3 1660 1
4 222 3
5 341 3
6 527 2
7 569 3
因为我们只对特定值感兴趣(在OP中给出527,但这里有两个感兴趣的值,527和222:
result[which(result$codes %in% c('527','222')),]
codes count
4 222 3
6 527 2