数据转换为实验配置文件、嵌套实验、嵌套在 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))
我正在慢慢地使用 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
:
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))