从不同长度的数据帧有条件地分配变量值

时间:2018-04-07 04:03:14

标签: r dataframe

我经常遇到这种情况:

我有一个设计实验,每个实验单元都有一个治疗值,我有一个描述实验设计的数据框(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”标签的数据。

1 个答案:

答案 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