具有相同名称但相异的两个匹配列的行均值:“ _ 1”和“ _2”

时间:2020-10-01 14:36:43

标签: 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

我想取相同名称的列,只是其编号有所不同,例如“ _1”和“ _2”并采用成对均值。实际上,我有一个很大的数据框,其中有许多对,它们的排列顺序不是很好,因此正在寻找可以应用于此的聪明解决方案。

所以输出应如下所示:

  col
1   2
2   3
3   4
4   5

给出的列名与列对相同,但删除了附加标签。

任何帮助都将非常感谢。

3 个答案:

答案 0 :(得分:4)

这是使用my_df['timestamp'] = pd.Timestamp.now() + list2DF + split.default

的基本R选项
rowMeans

给出

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

答案 1 :(得分:1)

尝试这种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)

输出:

# A tibble: 4 x 1
    col
  <dbl>
1     2
2     3
3     4
4     5

答案 2 :(得分:1)

这是面向purrr的解决方案:

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

即使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))