我在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
Run Code Online (Sandbox Code Playgroud)
基本上我想要做的是获取每列(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
Run Code Online (Sandbox Code Playgroud)
只是简单地解释一下我的结果:在'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
Run Code Online (Sandbox Code Playgroud)
让我再解释一下:在'a'栏中,只关注那些在'id'栏中有数字'2'的观察,我们可以说数字'1'出现4次,数字'2'出现3次和数字'3'发生了3次.
所以这就是我想做的.计算每个自定义子集的数字出现次数(然后将这些值收集到数据框中).我知道这不是一项艰巨的任务,但问题是我必须定期更改输入'df'数据帧,因此行和列的总数可能随时间而变化......
到目前为止我所做的是我将'df'数据帧与列分开,如下所示:
for (z in (2:ncol(df))) assign(paste("df",z,sep="."),df[,z])
Run Code Online (Sandbox Code Playgroud)
所以df.2将引用df $ a,df.3将等于df $ b,df.4将等于df $ c等.但我现在真的被卡住了,我不知道如何继续前进...
是否有适当的"自动"方式来解决这个问题?
怎么样 -
> library(reshape)
> dftab <- table(melt(df,'id'))
> dftab
, , value = 1
variable
id a b c d e
1 3 8 2 2 4
2 4 6 3 2 4
3 4 2 1 5 1
, , value = 2
variable
id a b c d e
1 0 1 4 3 3
2 3 3 3 6 2
3 1 4 5 3 4
, , value = 3
variable
id a b c d e
1 7 1 4 5 3
2 3 1 4 2 4
3 5 4 4 2 5
Run Code Online (Sandbox Code Playgroud)
因此,要获得'3'列'a'和组'1'的数量,你可以做到
> dftab[3,'a',1]
[1] 4
Run Code Online (Sandbox Code Playgroud)