我正在使用R和dplyr包慢慢地完成数据转换。我从每个受访者的唯一行开始。数据来自联合实验,因此我需要前往嵌套在实验迭代中的配置文件(实验中的配置文件A或B)(每个受访者进行5次实验)嵌套在受访者ID中。
我已经成功地转换了数据,将实验嵌套在受访者ID中。现在,我有多个包含属性特征的列X1-Xn。然而,在这一点上,这些属性实际上是重复的,比如说,在实验中,X1包括用于配置文件A的变量,而X6包括相同的变量,但用于配置文件B。
在下面的模拟图像示例中,我基本上需要将列v1a和v1b合并为v1,将v2a和v2b合并为v2,依此类推,同时生成一个新列,如果它们来自a或b,则对它们进行分隔。
在评论之后,我编辑了这篇文章,以包含原始数据结构和理想结果数据的简单代码:
#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中嵌套多个变量的方法。
任何指导都将不胜感激。
发布于 2021-07-28 14:42:41
我们可以使用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))发布于 2021-07-28 13:27:14
让我们来看一个最小的工作示例。
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,4https://stackoverflow.com/questions/68552756
复制相似问题