在R中的循环内水平连接数据帧

在R中的循环内水平连接数据帧,r,dataframe,concatenation,R,Dataframe,Concatenation,我使用bellow函数与pairwise.wilcox.test比较各组水平: 我想要的是通过公共第一列水平连接这些数据帧,因此结果输出如下所示: Compared groups p-value p-value p-value 1 1StL - 3StL 1 1,0000000 1 2 1StL - IP 1 0,1092484 1 3 1StL - ISR 1 1,0000000

我使用bellow函数与pairwise.wilcox.test比较各组水平:

我想要的是通过公共第一列水平连接这些数据帧,因此结果输出如下所示:

   Compared groups p-value   p-value   p-value
1      1StL - 3StL       1 1,0000000       1
2        1StL - IP       1 0,1092484       1
3       1StL - ISR       1 1,0000000       1
4       1StL - ISU       1 1,0000000       1
5       1StL - StM       1 1,0000000       1
6      3StL - 3StL      NA        NA      NA
7        3StL - IP       1 1,0000000       1
...
如何做到这一点?请记住,我有更多的变量。

我的数据集(并非所有数据):


你的结构陈述对我不起作用……我想这就是你问题的本质

df1 <- data.frame(group=c('A', 'B', 'C'), result1=c(1, 2, 3))
df2 <- data.frame(group=c('A', 'B', 'C'), result2=c(4, 5, 6))
df3 <- data.frame(group=c('A', 'B', 'C'), result3=c(7, 8, 9))

result.temp <- merge(df1, df2)
result      <- merge(result.temp, df3)

result
#   group result1 result2 result3
# 1     A       1       4       7
# 2     B       2       5       8
# 3     C       3       6       9

你的结构陈述对我不起作用……我想这就是你问题的本质

df1 <- data.frame(group=c('A', 'B', 'C'), result1=c(1, 2, 3))
df2 <- data.frame(group=c('A', 'B', 'C'), result2=c(4, 5, 6))
df3 <- data.frame(group=c('A', 'B', 'C'), result3=c(7, 8, 9))

result.temp <- merge(df1, df2)
result      <- merge(result.temp, df3)

result
#   group result1 result2 result3
# 1     A       1       4       7
# 2     B       2       5       8
# 3     C       3       6       9

你的结构陈述对我不起作用……我想这就是你问题的本质

df1 <- data.frame(group=c('A', 'B', 'C'), result1=c(1, 2, 3))
df2 <- data.frame(group=c('A', 'B', 'C'), result2=c(4, 5, 6))
df3 <- data.frame(group=c('A', 'B', 'C'), result3=c(7, 8, 9))

result.temp <- merge(df1, df2)
result      <- merge(result.temp, df3)

result
#   group result1 result2 result3
# 1     A       1       4       7
# 2     B       2       5       8
# 3     C       3       6       9

你的结构陈述对我不起作用……我想这就是你问题的本质

df1 <- data.frame(group=c('A', 'B', 'C'), result1=c(1, 2, 3))
df2 <- data.frame(group=c('A', 'B', 'C'), result2=c(4, 5, 6))
df3 <- data.frame(group=c('A', 'B', 'C'), result3=c(7, 8, 9))

result.temp <- merge(df1, df2)
result      <- merge(result.temp, df3)

result
#   group result1 result2 result3
# 1     A       1       4       7
# 2     B       2       5       8
# 3     C       3       6       9

不确定这会增加多少,但您询问了如何在函数中实现这一点:

pw.wcx <- function(data,x,factor){
  result <- Reduce(function(x,y)merge(x,y,by="Var1"),
                   lapply(data[x],function(d){
                     pw <- pairwise.wilcox.test(d,factor,p.adj="bonf")[[3]]
                     transform(melt(pw),Var1=paste(Var2,Var1,sep="-"))[-2]}),
                   accumulate=FALSE)
  colnames(result) <- c("Compared Groups",names(data[x]))
  result
}
result <- pw.wcx(tabel2,2:4,tabel2$lot)
head(result)
#   Compared Groups RS.5_1    RS.5_2 RS.5_3
# 1       1StL-3StL      1 1.0000000      1
# 2         1StL-IP      1 0.1092484      1
# 3        1StL-ISR      1 1.0000000      1
# 4        1StL-ISU      1 1.0000000      1
# 5        1StL-StM      1 1.0000000      1
# 6       3StL-3StL     NA        NA     NA

此版本将避免警告,但我不建议使用此版本。这基本上使用了
lappy(…)
作为一个美化的for循环,它没有利用R非常高效的列表处理(例如,使用
data[,i]
在每次迭代中对数据帧进行一次子集划分,而不是在开始时仅使用
data[x]进行一次子集划分)

不确定这会增加多少,但您询问了如何在函数中实现这一点:

pw.wcx <- function(data,x,factor){
  result <- Reduce(function(x,y)merge(x,y,by="Var1"),
                   lapply(data[x],function(d){
                     pw <- pairwise.wilcox.test(d,factor,p.adj="bonf")[[3]]
                     transform(melt(pw),Var1=paste(Var2,Var1,sep="-"))[-2]}),
                   accumulate=FALSE)
  colnames(result) <- c("Compared Groups",names(data[x]))
  result
}
result <- pw.wcx(tabel2,2:4,tabel2$lot)
head(result)
#   Compared Groups RS.5_1    RS.5_2 RS.5_3
# 1       1StL-3StL      1 1.0000000      1
# 2         1StL-IP      1 0.1092484      1
# 3        1StL-ISR      1 1.0000000      1
# 4        1StL-ISU      1 1.0000000      1
# 5        1StL-StM      1 1.0000000      1
# 6       3StL-3StL     NA        NA     NA

这个版本将避免警告,但我不推荐它。它基本上使用
lappy(…)
作为一个美化的for循环,它没有利用R非常高效的列表处理(例如,使用
data[,I]
在每个迭代中对数据帧进行一次子集设置,而不是在开始时仅使用
data[x]进行一次

不确定这会增加多少,但您询问了如何在函数中实现这一点:

pw.wcx <- function(data,x,factor){
  result <- Reduce(function(x,y)merge(x,y,by="Var1"),
                   lapply(data[x],function(d){
                     pw <- pairwise.wilcox.test(d,factor,p.adj="bonf")[[3]]
                     transform(melt(pw),Var1=paste(Var2,Var1,sep="-"))[-2]}),
                   accumulate=FALSE)
  colnames(result) <- c("Compared Groups",names(data[x]))
  result
}
result <- pw.wcx(tabel2,2:4,tabel2$lot)
head(result)
#   Compared Groups RS.5_1    RS.5_2 RS.5_3
# 1       1StL-3StL      1 1.0000000      1
# 2         1StL-IP      1 0.1092484      1
# 3        1StL-ISR      1 1.0000000      1
# 4        1StL-ISU      1 1.0000000      1
# 5        1StL-StM      1 1.0000000      1
# 6       3StL-3StL     NA        NA     NA

这个版本将避免警告,但我不推荐它。它基本上使用
lappy(…)
作为一个美化的for循环,它没有利用R非常高效的列表处理(例如,使用
data[,I]
在每个迭代中对数据帧进行一次子集设置,而不是在开始时仅使用
data[x]进行一次

不确定这会增加多少,但您询问了如何在函数中实现这一点:

pw.wcx <- function(data,x,factor){
  result <- Reduce(function(x,y)merge(x,y,by="Var1"),
                   lapply(data[x],function(d){
                     pw <- pairwise.wilcox.test(d,factor,p.adj="bonf")[[3]]
                     transform(melt(pw),Var1=paste(Var2,Var1,sep="-"))[-2]}),
                   accumulate=FALSE)
  colnames(result) <- c("Compared Groups",names(data[x]))
  result
}
result <- pw.wcx(tabel2,2:4,tabel2$lot)
head(result)
#   Compared Groups RS.5_1    RS.5_2 RS.5_3
# 1       1StL-3StL      1 1.0000000      1
# 2         1StL-IP      1 0.1092484      1
# 3        1StL-ISR      1 1.0000000      1
# 4        1StL-ISU      1 1.0000000      1
# 5        1StL-StM      1 1.0000000      1
# 6       3StL-3StL     NA        NA     NA


这个版本将避免警告,但我不推荐它。它基本上使用
lappy(…)
作为一个美化的for循环,它没有利用R非常高效的列表处理(例如,使用
data[,I]
在每个迭代中对数据帧进行一次子集设置,而不是在开始时仅使用
data[x]进行一次

如果这是他需要的,他应该使用
Reduce
merge
并指定要合并的列。如果这是他需要的,他应该使用
Reduce
merge
并指定要合并的列。如果这是他需要的,他应该使用
Reduce
merge
并指定y要合并的列。如果这是他需要的,他应该使用
Reduce
merge
并指定要合并的列。工作得很有魅力!非常感谢!P.s.在
结果中,你的函数工作(它产生预期的结果),但有50多个警告:
1:In merge.data.frame(x,y,by=“Var1”):列名'value.x'、'value.y'在结果中重复。
。为什么会发生这种情况?这是因为列表中的每个数据帧都有一个名为
value
(由于使用了
melt(…)
),因此它试图在合并结果中创建多个具有该名称的列。但我在函数退出之前重命名了这些列,因此您在最终结果中看不到这一点。这可能并不重要,因为函数可以工作,但消息
出现了50个或更多警告…
仍然存在。可以重命名
p-value
合并前的列,如merge.data.frame(x,y,by=“Var1”)中的警告所述:列名'value.x'、'value.y'在结果中重复
?这有助于删除警告吗?为什么您如此渴望获得警告的id?尽管如此,请参阅我的编辑。效果非常好!非常感谢!P.S.在
结果中,您的函数工作正常(它产生预期的结果),但有50多个警告:
1:In merge.data.frame(x,y,by=“Var1”):列名'value.x','value.y'在结果中重复。
。为什么会发生这种情况?这是因为列表中的每个数据帧都有名为
value的p值列(由于使用了
melt(…)
),因此它试图在合并结果中创建多个具有该名称的列。但我在函数退出之前重命名了这些列,因此您在最终结果中看不到这一点。这可能并不重要,因为函数可以工作,但消息
出现了50个或更多警告…
仍然存在。可以重命名
p-value
合并前的列,如merge.data.frame(x,y,by=“Var1”)中的警告所述:列名'value.x'、'value.y'在结果中重复
?这有助于删除警告吗?为什么您如此渴望获得警告的id?尽管如此,请参阅我的编辑。效果非常好!非常感谢!P.S.在
结果中,您的函数工作正常(它产生预期的结果),但有50多个警告:
1:In merge.data.frame(x,y,by=“Var1”):列名'value.x','value.y'在结果中重复。
。为什么会发生这种情况?这是因为列表中的每个数据帧都有名为
value的p值列(由于使用了
melt(…)
),因此它试图在合并结果中创建多个具有该名称的列。但我在函数退出之前重命名了这些列,因此您在最终结果中看不到这一点。这可能并不重要,因为函数可以工作,但消息
出现了50个或更多警告…
仍然存在。可以重命名
p-value
合并前的列