在R中创建多个变量的结果表

时间:2018-04-06 15:11:03

标签: r

我正在使用包含多个包含类似信息的变量的大型数据集。变量范围从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

但是,我只想检索一组非常具体的值的频率,例如仅提取5271600的频率。

我最初尝试使用像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”个案的正确数量是多少。为什么第一种方法给出不正确的因子水平总和的任何建议? 感谢您的帮助,如果我能提供更多信息,请告知我们

2 个答案:

答案 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