【问题标题】:How to divide each of a range a variables by a second range of variables in R如何将每个变量范围除以R中的第二个变量范围
【发布时间】:2019-08-16 09:49:14
【问题描述】:

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

我所有的列都遵循相同的名称格式,disease1_num、disease2_num、disease1_den、disease1_den

我想将 disease1_num/disease1_den*100 划分为 disease1_perc,然后将 disease2_num/disease2_den*100 划分为 disease2_perc 等。

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

我主要是使用 tidyverse 命令。

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


# 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')

【问题讨论】:

标签: r tidyverse


【解决方案1】:

我们可以只使用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 的数量相同。

【讨论】:

  • 感谢 Ronak,我意识到我已经稍微简化了我的问题,disease1 是每次都会改变的疾病名称,例如af007 那么 disease2 是 bp002,有没有办法提取列名呢?它们总是以 _num 和 _den 结尾
猜你喜欢
  • 2011-08-26
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
相关资源
最近更新 更多