首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据转换为实验配置文件,嵌套实验,嵌套在R中的受访者中

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

Stack Overflow用户
提问于 2021-07-28 07:26:05
回答 2查看 50关注 0票数 1

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

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

在下面的模拟图像示例中,我基本上需要将列v1a和v1b合并为v1,将v2a和v2b合并为v2,依此类推,同时生成一个新列,如果它们来自a或b,则对它们进行分隔。

在评论之后,我编辑了这篇文章,以包含原始数据结构和理想结果数据的简单代码:

代码语言:javascript
运行
复制
#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中嵌套多个变量的方法。

任何指导都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-28 14:42:41

我们可以使用sapply对基数R执行此操作

代码语言:javascript
运行
复制
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 = ","))
}))

输出:

代码语言:javascript
运行
复制
  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

数据:

代码语言:javascript
运行
复制
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))
票数 1
EN

Stack Overflow用户

发布于 2021-07-28 13:27:14

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

代码语言:javascript
运行
复制
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创建的。

代码语言:javascript
运行
复制
df <- mutate(df,v1=paste(df$v1a,",",df$v1b, sep=""))

结果:

代码语言:javascript
运行
复制
  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

代码语言:javascript
运行
复制
df <- select(df,- (v1a | v1b))

这导致了

代码语言:javascript
运行
复制
  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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68552756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档