如何用R

时间:2019-08-16 09:49:14

标签: r tidyverse

我有一系列包含某些疾病分子的列,并且有一系列包含相同疾病分母的列。我想遍历每个分子列,除以相应的分母列,为每种疾病创建一个百分比列。

我所有的列都使用相同的名称格式,疾病1_num,疾病2_num,疾病1_den,疾病1_den

我想将疾病1_num / disease1_den * 100除以创建疾病1_perc,然后将疾病2_num / disease2_den * 100除以创建疾病2_perc等。

我的数据集中大约有20种疾病。

我主要使用tidyverse命令。

我曾尝试使用collect创建两个数据集,一个使用分子,一个使用分母,提取疾病名称,将它们连接在一起,计算百分比,然后再次传播数据集,然后再将其添加回原始数据集中,确实有效,但是有点麻烦,理想情况下,我想在原始数据集中执行此操作。


# A tibble: 3 x 5
     id disease1_num disease2_num disease1_den disease2_den
  <dbl>        <dbl>        <dbl>        <dbl>        <dbl>
1     1            5            4           12           15
2     2            8            6           14           16
3     3           10            8           17           18


df_num <- df %>%
  select(id,disease1_num:disease2_num) %>% 
  gather(key="num_indicator",value="num",disease1_num:disease2_num) %>% 
  mutate(indicator=str_remove(num_indicator,'_num'))

df_den <- df%>%
  select(id, disease1_den:disease2_den) %>% 
  gather(key="den_indicator",value="den",disease1_den:disease2_den) %>% 
  mutate(indicator=str_remove(den_indicator,'_den'))

df_numden <- left_join(df_num,df_den,c('id','indicator'))                             

df_perc <- df_numden %>% 
  mutate(perc_indicator=str_replace(den_indicator,'den','perc'),
         perc=num/den*100) %>% 
  select(id, perc_indicator:perc) %>%
  spread(perc_indicator,perc)

df_final <- left_join(df,df_perc,'id')

1 个答案:

答案 0 :(得分:0)

我们可以只使用grep来获取列索引并直接进行除法。

num_cols <- grep("num$", names(df), value = TRUE)
den_cols <- grep("den$", names(df), value = TRUE)
df[sub("_num","_perc", num_cols)]<- df[num_cols]/df[den_cols] * 100

df
#  id disease1_num disease2_num disease1_den disease2_den disease1_perc disease2_perc
#1  1            5            4           12           15          41.7          26.7
#2  2            8            6           14           16          57.1          37.5
#3  3           10            8           17           18          58.8          44.4

请注意,您需要确保num_colsden_cols的数目相同。