我所有的列都使用相同的名称格式,疾病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')
答案 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_cols
和den_cols
的数目相同。