我经常遇到这种情况:
我有一个设计实验,每个实验单元都有一个治疗值,我有一个描述实验设计的数据框(df.design)。最终数据文件(df.data)可能具有不同数量的测量值,并且仅具有实验单元的ID,而不是处理变量。
我的目标是能够在df.data中创建一个治疗变量,基于 df.design
换句话说 df.data $ treatment 应该等于 df.design $ treatment df.data $ ID == df.design $ ID 即使长度(df.data $ ID)!= length(df.design $ ID)
因为这是一个具有非常不同数据集的常见场景,所以我希望在场景之间进行通用或至少可以轻松修改。
我尝试过以下方面的解决方案:
df.data$treatment <- case_when(
df.data$ID[i] == df.design$ID[i] ~ df.design$treatment[i])
但这会返回<NA>s
示例df.desgin
> head(df.design)
ID treatment
1 1 No heat - Keep all foliage
2 2 Heat - Remove new foliage
3 3 No heat - Remove old foliage
4 4 No heat - Remove new foliage
5 5 Heat - Remove old foliage
6 6 Heat - Keep all foliage
示例df.data:
> head(df.data)
obs ID subsample A
1 1 1 New 1.3
2 13 2 New 3.3
3 12 2 Mature 1.1
4 14 3 Mature 3.8
5 15 4 Mature 3.4
6 16 5 Mature 2.0
您会看到一些但不是所有ID都有多个测量值(“A”)。这些测量来自仪器,该仪器生成带有“obs”,“ID”和“subsample”标签的数据。
答案 0 :(得分:1)
我已创建了一些数据,然后想出了一个解决方案。
set.seed(1)
df_design <- data.frame(ID = 1:10, treatment = runif(10))
df_data <- data.frame(ID = sample(1:10, 4))
df_design
# ID treatment
# 1 1 0.26550866
# 2 2 0.37212390
# 3 3 0.57285336
# 4 4 0.90820779
# 5 5 0.20168193
# 6 6 0.89838968
# 7 7 0.94467527
# 8 8 0.66079779
# 9 9 0.62911404
# 10 10 0.06178627
df_data
#
# ID
# 1 3
# 2 2
# 3 6
# 4 10
df_data$treatment <- sapply(1:nrow(df_data),
function(x) df_design[df_design$ID %in% df_data$ID[x], "treatment"])
df_data
# ID treatment
# 1 3 0.57285336
# 2 2 0.37212390
# 3 6 0.89838968
# 4 10 0.06178627