You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:长格式数据配对t检验时剔除无配对观测值

不用转宽格式实现配对t检验的方法

当然可以不用转成宽格式来完成这个任务!作为R新手,我们一步步拆解,保证每一步都清晰易懂:

1. 先把你的数据构建成R数据框

首先,我们需要把你给出的原始数据转换成R能识别的长格式数据框:

# 创建长格式数据框
df <- data.frame(
  obs = c("A", "B", "C", "D", "E", "F", "G", "A", "C", "D", "F", "G"),
  time = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
  value = c(5.5, 7.1, 4.3, 6.4, 6.6, 5.6, 6.6, 6.5, 6.7, 7.8, 5.7, 8.9)
)

2. 筛选出同时存在time1和time2的观测对象

我们需要剔除那些只有一个时间点数据的obs(也就是B和E),这里提供两种方法,你可以选自己觉得顺手的:

方法一:Base R 原生操作

适合不想加载额外包的新手:

# 统计每个obs出现的次数
obs_counts <- table(df$obs)
# 筛选出出现2次的obs(即同时有time1和time2数据)
valid_obs <- names(obs_counts[obs_counts == 2])
# 过滤数据框,只保留有效的obs
filtered_df <- df[df$obs %in% valid_obs, ]
# 按obs和time排序,确保配对顺序正确
filtered_df <- filtered_df[order(filtered_df$obs, filtered_df$time), ]

方法二:用dplyr包(更简洁直观)

如果你愿意加载常用的数据处理包dplyr,代码会更易读:

# 先安装dplyr(如果没安装过,先运行这行)
# install.packages("dplyr")
library(dplyr)

filtered_df <- df %>%
  group_by(obs) %>%       # 按obs分组
  filter(n() == 2) %>%    # 只保留每组有2条数据的obs
  ungroup() %>%           # 取消分组
  arrange(obs, time)      # 按obs和time排序,保证配对顺序正确

3. 执行配对t检验

现在数据已经准备好,直接用t.test()函数,不需要转宽格式!这里也有两种写法:

写法一:直接提取两个时间点的数值向量

# 提取time1和time2的value值
time1_values <- filtered_df$value[filtered_df$time == 1]
time2_values <- filtered_df$value[filtered_df$time == 2]

# 执行配对t检验
t.test(time1_values, time2_values, paired = TRUE)

写法二:用公式形式(更贴合长格式数据)

因为我们已经确保每个obs都有两个时间点的数据,直接用公式value ~ time,并指定paired = TRUE即可:

t.test(value ~ time, data = filtered_df, paired = TRUE)

新手小贴士

  • 执行完筛选后,可以用View(filtered_df)查看数据,确认B和E已经被剔除,且每个obs都有time1和time2的记录
  • 排序很重要!确保每个obs的time1和time2数据是对应的,避免配对错误
  • 如果你的数据量很大,dplyr的方法通常会更高效且代码更易维护

内容的提问来源于stack exchange,提问作者Ishtiaq Mawla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:52:33