假设我的数据框中有几列,它们来自一系列类似的因素:
例如:A1_Factor1
,A1_Factor2
,A1_Factor3
,B1_Factor1
,B1_Factor2
,C1_Factor1
等
我想要的是使用此数据创建其他列。所以:
A1_Mean
- 这应该是以A1
B1_Mean
- 这应该是以B1
A1_Min
- 这应该是以A1
开头的列的最小值
B1_Min
- 这应该是以B1
开头的列的最小值
A1_SD
- 这应该是以A1
B1_SD
- 这应该是以B1
如何在R中完成,以便代码首先提取具有相似首字母的列,然后对其执行所需的分析。然后使用相同的首字母创建新列?
提前感谢您的帮助! :)
答案 0 :(得分:0)
我创建了一个小例子,这就是我所拥有的,
df <- data.frame("A1_factor1" = rnorm(5), "A1_factor2" = rnorm(5),
"B1_factor1" = rnorm(5), "B1_factor2" = rnorm(5))
col.names <- names(df)
group <- unique(substr(col.names, 1, 2))
for (i in 1:length(group)){
group.df <- df[, substr(names(df), 1, 2) == group[i]]
df[, ncol(df)+1] <- apply(group.df, 1, mean)
df[, ncol(df)+1] <- apply(group.df, 1, min)
df[, ncol(df)+1] <- apply(group.df, 1, sd)
df[, ncol(df)+1] <- apply(group.df, 1, max)
names(df)[(ncol(df)-3):ncol(df)] <- paste(group[i], c("Mean", "Min", "SD", "Max"), sep = "_")
}
df
我希望这有帮助!
答案 1 :(得分:0)
您可以使用tidyverse
包
输入:
library(tidyverse)
set.seed(123)
df <- tibble(A1_abc = sample(1:10, 5),
A1_cde = sample(10:15, 5),
B1_abc = sample(1:10, 5),
B1_cde = sample(15:20, 5))
df
# A tibble: 5 x 4
A1_abc A1_cde B1_abc B1_cde
<int> <int> <int> <int>
1 3 10 10 20
2 8 12 5 16
3 4 13 6 15
4 7 11 9 18
5 6 15 1 19
方式:强>
df %>%
gather(key, value) %>%
separate(key, c("gp", "rand"), sep = "_") %>%
select(-rand) %>%
group_by(gp) %>%
mutate(id = 1:n()) %>%
spread(gp, value) %>%
summarise_at(vars(2:3), funs(Min = min(.),
Max = max(.),
Mean = mean(.),
SD = sd(.)))
<强>输出:强>
# A tibble: 1 x 8
A1_Min B1_Min A1_Max B1_Max A1_Mean B1_Mean A1_SD B1_SD
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 3. 1. 15. 20. 8.90 11.9 3.96 6.61
如果您想添加更多功能,只需将其添加到funs()
summarise_at()
功能中