数据转换为实验配置文件、嵌套实验、嵌套在 R 中的受访者中

Data transformation to experimental profiles, nested experiments, nested in respondents in R

我正在慢慢地使用 R 和 dplyr 包进行数据转换。我从每个受访者的唯一行开始。数据来自一个联合实验,所以我需要转向嵌套在实验迭代中的配置文件(实验中的配置文件 A 或 B)(每个受访者进行了 5 次实验)嵌套在受访者 ID 中。

我已成功转换数据以获得嵌套在受访者 ID 中的实验。现在我有多个包含属性特征的列 X1-Xn。然而,这些在这一点上有效地重复属性,例如,X1 包括实验中配置文件 A 的变量,X6 包括相同的变量但用于配置文件 B。

在下面的模拟图像示例中,我基本上需要将 v1a 和 v1b 列合并为 v1,v2a 和 v2b 合并为 v2 等等,同时生成一个新列来分隔它们是来自 a 还是 b .

跟进评论和有用但不完全是需要参与这个原始 post,我编辑了 post 以包含原始数据结构和理想数据结构的简单代码结果数据:

#original dataframe    
ID <- c(1, 1, 1, 2, 2, 2) 
`Ex ID` <- c(1, 2, 3, 1, 2, 3) 
v1a <- c(2, 4, 5, 1, 3, 5) 
v2a = c(3, 4, 5, 2, 1, 5) 
v3a = c(5, 4, 3, 3, 2, 1) 
v1b = c(4, 5, 5, 1, 5, 4) 
v2b = c(5, 2, 2, 4, 1, 4) 
v3b = c(5, 5, 4, 5, 4, 5)
original <- data.frame(ID, 'Ex ID' , v1a, v2a, v3a, v1b, v2b, 
v3b)

#wanted data frame
ID <- c(1, 1, 1, 1, 1, 1)
`Ex ID` <- c(1, 1, 2, 2, 3, 3)
profile <- c("a", "b", "a", "b", "a", "b")
v1ab = c(2, 4, 4, 5, 5, 5)
v2ab = c(3, 5, 4, 2, 5, 2)
v3ab = c(5, 5, 4, 5, 3, 4)
desired <- data.frame(ID, 'Ex ID', profile, v1ab, v2ab, v3ab)

我基本上想找到一种在 ID、实验 ID、配置文件 ID 中嵌套多个变量的方法。

任何指导将不胜感激。

让我们看一个最小的工作示例。

df<-data.frame(ID=c(1,1,1,2,2,3),v1a=c(2,4,5,1,3,5),v1b=c(4,5,5,1,5,4))

要合并列 v1a 和 v1b,我们可以使用命令 paste,它连接字符串。新列是使用 dplyr 包附带的 mutate 创建的。

df <- mutate(df,v1=paste(df$v1a,",",df$v1b, sep=""))

结果:

  ID v1a v1b  v1
1  1   2   4 2,4
2  1   4   5 4,5
3  1   5   5 5,5
4  2   1   1 1,1
5  2   3   5 3,5
6  3   5   4 5,4

如果要删除“旧”列 v1a 和 v1b,可以使用 select

df <- select(df,- (v1a | v1b))

这导致

  ID  v1
1  1 2,4
2  1 4,5
3  1 5,5
4  2 1,1
5  2 3,5
6  3 5,4

我们可以使用 sapply:

对基数 R 进行此操作
cols <- split(names(df)[-c(1,2)], substr(names(df)[-c(1,2)], start = 1, stop = 2))

cbind(df[c(1,2)], sapply(names(cols), function(col) {
    do.call(paste, c(df[cols[[col]]], sep = ","))
}))

输出:

  ID Ex_ID  v1  v2
1  1     1 2,4 3,5
2  1     2 4,5 4,2
3  1     3 5,5 5,2
4  2     1 1,1 2,4
5  2     2 3,5 1,1
6  2     3 5,4 5,4
7  3     1 4,4 2,5
8  3     2 1,1 5,4
9  3     3 4,5 1,2

数据:

df <- tibble(ID = c(1, 1, 1, 2, 2, 2, 3, 3, 3), Ex_ID = c(1, 
2, 3, 1, 2, 3, 1, 2, 3), v1a = c(2, 4, 5, 1, 3, 5, 4, 1, 4), 
v2a = c(3, 4, 5, 2, 1, 5, 2, 5, 1), v1b = c(4, 5, 5, 1, 5, 
4, 4, 1, 5), v2b = c(5, 2, 2, 4, 1, 4, 5, 4, 2))