我在R中有一个数据框,类似于以下内容。实际上,我的真实“df”数据框比这个要大得多,但我真的不想让任何人感到困惑,所以我尽可能地简化了事情。
这就是数据框:
id <-c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3)
a <-c(3,1,3,3,1,3,3,3,3,1,3,2,1,2,1,3,3,2,1,1,1,3,1,3,3,3,2,1,1,3)
b <-c(3,2,1,1,1,1,1,1,1,1,1,2,1,3,2,1,1,1,2,1,3,1,2,2,1,3,3,2,3,2)
c <-c(1,3,2,3,2,1,2,3,3,2,2,3,1,2,3,3,3,1,1,2,3,3,1,2,2,3,2,2,3,2)
d <-c(3,3,3,1,3,2,2,1,2,3,2,2,2,1,3,1,2,2,3,2,3,2,3,2,1,1,1,1,1,2)
e <-c(2,3,1,2,1,2,3,3,1,1,2,1,1,3,3,2,1,1,3,3,2,2,3,3,3,2,3,2,1,3)
df <-data.frame(id,a,b,c,d,e)
df
我想做的基本上是获取每个列(a,b,c,d,e)和每个id组(1、2、3)中数字出现的次数(对于后者分组,请参见我的“id”列)。
因此,对于列'a'和id编号'1'(对于后者请参见列'id'),代码将如下所示:
as.numeric(table(df[1:10,2]))
##The results are:
[1] 3 7
简单说明一下我的结果:在列'a'中(仅考虑列'id'中数字为'1'的记录),我们可以看到数字'1'出现了3次,数字'3'出现了7次。
再举一个例子。对于列'a'和id号码'2'(对于后面的分组请再次查看列'id'):
as.numeric(table(df[11:20,2]))
##After running the codes the results are:
[1] 4 3 3
让我再解释一下:在列'a'中,只考虑那些在'id'列中有数字'2'的观测值,我们可以说数字'1'出现了4次,数字'2'出现了3次,数字'3'出现了3次。
所以这就是我想做的事情。计算每个自定义子集中数字的出现次数(然后将这些值收集到数据框中)。我知道这不是一个困难的任务,但问题在于我需要经常改变输入的'df'数据框,因此随着时间的推移,行和列的总数可能会发生变化...
到目前为止,我已经按列分离了'df'数据框,像这样:
for (z in (2:ncol(df))) assign(paste("df",z,sep="."),df[,z])
所以,df.2将引用df$a,df.3将等于df$b,df.4将等于df$c等。但是我现在真的卡住了,不知道该如何继续...
有没有适当的“自动”解决此问题的方法?
lapply(split(df[-1], df$id), apply, 2, function(x) table(factor(x, 1:3)))
- Charles