R按ID计算三列的模式

问题描述

我的数据框有几个单一数据(“重量”、“温度”)和三个后肢紧握分数(“Hindlimb_1”、“Hindlimb_2”、“Hindlimb_3”);都是在不同年龄(“年龄”)拍摄的。

str(hindlimb_data)
'data.frame':   10 obs. of  12 variables:
 $ ID            : Factor w/ 25 levels "26623","26625",..: 2 4 3 5 6 12 9 14 10 15
 $ Sex           : int  2 2 2 2 2 2 2 2 2 1
 $ Genotype      : Factor w/ 3 levels "NTg","Transgenic_1",..: 3 2 3 2 2 3 2 3 2 3
 $ Group         : Factor w/ 2 levels "Cross_sect","Longitudinal": 2 2 2 2 1 1 1 1 1 1
 $ Age           : num  8 8 8 8 8.5 7.5 7.5 7.5 7.5 7.5
 $ Weight        : num  30.8 31.2 28 27.5 32 33.2 26.7 32.5 27.2 29.2
 $ Temperature   : num  24.8 25.6 26.5 24.4 24.4 25.9 24.4 24.2 23.9 23.9
 $ Hindlimb_1    : num  2 2 3 0 2 2 0 2 2 0
 $ Hindlimb_2    : num  2 0 3 0 0 3 0 2 0 0
 $ Hindlimb_3    : num  2 0 3 0 0 2 0 2 0 1
 

我正在尝试计算每个受试者(“ID”)的三个后肢拍手数据得分(“Hindlimb_x”)的模式。我似乎只能在单独的一行中长时间输入每个分数时才能计算出这一点(但这会重复我数据框中其他变量的值;例如重量、温度)。

关于如何编码的任何想法? 谢谢!

解决方法

我们按 'ID' 分组并循环 acrossstarts_with 'Hindlimb_' 并返回 summariseed 'Mode'

library(dplyr)
df1 %>%
    group_by(ID) %>%
    summarise(across(starts_with('Hindlimb_'),Mode),.groups = 'drop')

哪里

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x,ux)))]
}