可以说我有数据框:
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
给出的列名与列对相同,但删除了附加标签。
任何帮助都将非常感谢。
答案 0 :(得分:4)
这是使用my_df['timestamp'] = pd.Timestamp.now()
+ list2DF
+ split.default
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))