R 两个同名但不同的匹配列的行平均值:'_1';和'_2';

R 两个同名但不同的匹配列的行平均值:'_1';和'_2';,r,R,假设我有数据帧: z = data.frame(col_1 = c(1,2,3,4), col_2 = c(3,4,5,6)) col_1 col_2 1 1 3 2 2 4 3 3 5 4 4 6 我想取名称相同但数字不同的列,例如“u1”和“u2”,并取成对平均值。实际上,我有一个包含许多对的大数据帧,它们的顺序不好,因此正在寻找一个可以应用于此的聪明解决方案 因此,输出应如下所示: col 1 2 2 3

假设我有数据帧:

z = data.frame(col_1 = c(1,2,3,4), col_2 = c(3,4,5,6))

  col_1 col_2
1     1     3
2     2     4
3     3     5
4     4     6
我想取名称相同但数字不同的列,例如“u1”和“u2”,并取成对平均值。实际上,我有一个包含许多对的大数据帧,它们的顺序不好,因此正在寻找一个可以应用于此的聪明解决方案

因此,输出应如下所示:

  col
1   2
2   3
3   4
4   5
列名称与列对相同,但附加标签已删除


任何帮助都将非常感谢。

试试这种
tidyverse
方法。通过使用
separate()
可以提取名称,然后通过重塑可以获得所需的输出。代码如下:

library(dplyr)
library(tidyr)
#Data
z = data.frame(col_1 = c(1,2,3,4), col_2 = c(3,4,5,6))
#Code
z1 <- z %>% mutate(id=1:n()) %>%
  pivot_longer(-id) %>%
  separate(name,c('var1','var2'),sep='_') %>%
  group_by(id,var1) %>% summarise(Mean=mean(value)) %>%
  pivot_wider(names_from = var1,values_from=Mean) %>% ungroup() %>% select(-id)
库(dplyr)
图书馆(tidyr)
#资料
z=数据帧(列1=c(1,2,3,4),列2=c(3,4,5,6))
#代码
z1%突变(id=1:n())%>%
枢轴长度(-id)%>%
单独的(名称,c('var1','var2'),sep='''''u')%>%
分组依据(id,var1)%>%总结(平均值=平均值(值))%>%
pivot\u更宽(名称\u from=var1,值\u from=Mean)%%>%ungroup()%%>%select(-id)
输出:

# A tibble: 4 x 1
    col
  <dbl>
1     2
2     3
3     4
4     5
#一个tible:4 x 1
上校
1     2
2     3
3     4
4     5

这里是一个使用
list2DF
+
split的基本R选项。默认值
+
rowMeans

list2DF(lapply(split.default(z,gsub("_\\d+","",names(z))),rowMeans))

  col
1   2
2   3
3   4
4   5

以下是一个面向
purr
的解决方案:

library(purrr)
library(stringr)
split.default(z, str_remove(names(z), "[:digit:]+$")) %>% map_dfc(rowMeans)

#> # A tibble: 4 x 1
#>   col_
#>   <dbl>
#> 1     2
#> 2     3
#> 3     4
#> 4     5
库(purrr)
图书馆(stringr)
split.default(z,str_remove(names(z),“[:digit:][+$”))%>%map_dfc(rowMeans)
#>#tibble:4 x 1
#>上校_
#>   
#> 1     2
#> 2     3
#> 3     4
#> 4     5
即使z为:

z <- data.frame(col_1 = c(1,2,3,4),
                col_2 = c(3,4,5,6),
                anothercol_1 = c(1,2,3,4),
                anothercol_2 = c(3,4,5,6))

z所以还有其他列叫做
abc_1。。。abc_n
xyz_1,…
所有列都是数字的?是的,所有列都是数字的,但它们只有对(因此n=2)。它们是在实验开始和结束时采取的措施。谢谢你的回答,这非常有效。你能解释一下gsub中的
“\ud+”
吗。我意识到在我的数据集中我实际上没有下划线,只是简单的
col1
col2
,但是你的解决方案仍然可以用gsub中的
“\\d+”
。@DylanDijk
\\d+
匹配多个连续数字的模式,例如
0-9
。这里有一个R中regex的链接,希望能有所帮助。