在R中的循环内水平连接数据帧
我使用bellow函数与pairwise.wilcox.test比较各组水平: 我想要的是通过公共第一列水平连接这些数据帧,因此结果输出如下所示:在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
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
合并前的列