简化数据框中数据的方法

ASH*_*H.K 1 row r simplify dataframe

我有一组处理蛋白质序列的15个数据框,我的目标是分析蛋白质随时间的变化.但是,我的数据框架有大约5000个基因.所以我正在寻找一种简化数据的方法,以便于分析.

下面是一个示例数据框.

> sample
  p1 p2 p3 year
1  a  d  d 1970
2  a  c  e 1970
3  b  d  e 1970
4  b  c  d 1985
5  b  c  d 1985
6  b  c  d 1999
Run Code Online (Sandbox Code Playgroud)

我想要做的是每年分析每个位置(p1 p2p3)并返回该年度该位置最常见的条目,从而创建一个每年只有一个序列的新数据框.结果数据框应如下所示:

> result
  p1 p2 p3 year
1  a  d  e 1970
2  b  c  d 1985
3  b  c  d 1999
Run Code Online (Sandbox Code Playgroud)

数据框已按日期排序,但我不知道每年有多少条目.那么,有没有办法用这种方法简化我的数据?

ags*_*udy 5

一个data.table解决方案:

dat <- read.table(text=' p1 p2 p3 year
1  a  d  d 1970
2  a  c  e 1970
3  b  d  e 1970
4  b  c  d 1985
5  b  c  d 1985
6  b  c  d 1999',header=TRUE)

library(data.table)
DT <- as.data.table(dat)

DT[,lapply(.SD,function(x){ y = table(x)
                            names(y)[which.max(y)]}),
   year]

#      year p1 p2 p3
#  1: 1970  a  d  e
#  2: 1985  b  c  d
#  3: 1999  b  c  d
Run Code Online (Sandbox Code Playgroud)

编辑另一个Base R解决方案:

do.call(rbind.data.frame,by(dat, dat$year, function(x) 
  lapply(x, function(y) { 
    t <- table(y)
    names(t)[which.max(t)]
  })))

#       p1 p2 p3 year
# 1970  a  d  e 1970
# 1985  b  c  d 1985
# 1999  b  c  d 1999
Run Code Online (Sandbox Code Playgroud)