r - 有条件地从不同长度的数据框中分配变量值



我经常遇到这种情况:

我有一个设计的实验,其中每个实验单元都被分配了一个处理值,并且我有一个描述实验设计的数据框(df.design)。最终数据文件(df.data)可能具有不同的测量次数,并且只有实验单元的ID,而不是处理变量。

我的目标是能够在 df.data 中创建一个基于df.design的处理变量

换句话说,df.data$treatment 应该等于 df.design$treatment anywhere df.data$ID==df.design$ID 即使 length(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"和"子样本"的数据的仪器。

我创建了一些数据,然后提出了一个解决方案。

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

最新更新