首页 > 解决方案 > 如何使用 Tidyverse 对几列进行分组并计算百分比并创建新的 df?

问题描述

我对绘制三元图很感兴趣。

如何使用Tidyverse对几列进行分组并计算百分比并创建新的 df?我可以一一做,不知道如何使用 Tidyverse 包。

样本数据

df1 <- structure(list(AGI = c("ATCG01240", "ATCG01310", "ATMG00070"), aox2_0h__1 = c(15.79105291, 14.82652303, 14.70630068), aox2_0h__2 = c(16.06494674, 14.50610036, 14.52189807), aox2_0h__3 = c(14.64596287, 14.73266459, 13.07143141), aox2_0h__4 = c(15.71713641, 15.15430026, 16.32190068 ), aox2_12h__1 = c(14.99030606, 15.08046949, 15.8317372), aox2_12h__2 = c(15.15569857, 14.98996474, 14.64862254), aox2_12h__3 = c(15.12144791, 14.90111092, 14.59618842), aox2_12h__4 = c(14.25648197, 15.09832061, 14.64442686), aox2_24h__1 = c(15.23997241, 14.80968391, 14.22573239 ), aox2_24h__2 = c(15.57551513, 14.94861669, 15.18808897), aox2_24h__3 = c(15.04928714, 14.83758685, 13.06948037), aox2_24h__4 = c(14.79035385, 14.93873234, 14.70402827), aox5_0h__1 = c(15.8245918, 14.9351844, 14.67678306), aox5_0h__2 = c(15.75108628, 14.85867002, 14.45704948 ), aox5_0h__3 = c(14.36545859, 14.79296855, 14.82177912), aox5_0h__4 = c(14.80626019, 13.43330964, 16.33482718), aox5_12h__1 = c(14.66327372, 15.22571466, 16.17761867), aox5_12h__2 = c(14.58089039, 14.98545497, 14.4331578), aox5_12h__3 = c(14.58091828, 14.86139511, 15.83898617 ), aox5_12h__4 = c(14.48097297, 15.1420725, 13.39369381), aox5_24h__1 = c(15.41855602, 14.9890092, 13.92629626), aox5_24h__2 = c(15.78386057, 15.19372889, 14.63254456), aox5_24h__3 = c(15.55321382, 14.82013321, 15.74324956), aox5_24h__4 = c(14.53085803, 15.12196994, 14.81028556 ), WT_0h__1 = c(14.0535031, 12.45484834, 14.89102226), WT_0h__2 = c(13.64720361, 15.07144643, 14.99836235), WT_0h__3 = c(14.28295759, 13.75283646, 14.98220861), WT_0h__4 = c(14.79637443, 15.1108037, 15.21711524 ), WT_12h__1 = c(15.05711898, 13.33689777, 14.81064042), WT_12h__2 = c(14.83846779, 13.62497318, 14.76356308), WT_12h__3 = c(14.77215863, 14.72814995, 13.0835214), WT_12h__4 = c(14.70685445, 14.98527337, 16.12727292), WT_24h__1 = c(15.43813077, 14.56918572, 14.92146565 ), WT_24h__2 = c(16.05986898, 14.70583866, 15.64566505), WT_24h__3 = c(14.87721853, 13.22461859, 16.34119942), WT_24h__4 = c(14.92822133, 14.74382383, 12.79146694)), class = "data.frame", row.names = c(NA, -3L))

我使用的脚本

    sdf1 <- gather(df1, "group", "Expression",-AGI) %>%
  separate(group, c("sample", "time", "r")) %>%
  unite(tgroup, c("sample", "time"))  %>%
  group_by(AGI, tgroup) %>%
  summarize(expression_mean = mean(Expression)) %>%
  spread(tgroup, expression_mean) %>%
  column_to_rownames(colnames(.)[1])


sdf2 <- mutate(sdf1, WTper_0h = NA, WTper_12h = NA, WTper_24h = NA)
for (i in 1:nrow(sdf2)){
  total_abun <- sum(sdf2$WT_0h[i], sdf2$WT_12h[i], sdf2$WT_24h[i])
  sdf2$WTper_0h[i] <- sdf2$WT_0h[i]/total_abun*100
  sdf2$WTper_12h[i] <- sdf2$WT_12h[i]/total_abun*100
  sdf2$WTper_24h[i] <- sdf2$WT_24h[i]/total_abun*100
}

有人可以帮我吗

例如

aox2_oh 的百分比 = [aox2_oh / (aox2_oh+aox2_12h+aox2_24h)] *100

WT_12h 的百分比 = [WT_12h / (WT_oh+WT_12h+WT_24h)] *100

预期结果。

在此处输入图像描述

标签: rtidyversetidyr

解决方案


你可以试试:

sdf2 <- df %>%
  gather(variable,value,-AGI) %>%
  group_by(AGI) %>%
  mutate(total_abun = sum(value),perc = 100*value/total_abun)

推荐阅读