创建一个“其他”列,其中包含不符合条件的所有列的总和

时间:2017-07-14 15:15:02

标签: r

我有一个像这样的数据框

data.frame(age=c("(0,5]", "(5,10]", "(10,15]", "(15,20]", "(20,25]", "(25,30]"),
           C1=c(0, 0, 0, 0, 0, 0),
           C2=c(0, 0, 0, 0, 0, 0),
           C3=c(0, 270, 30, 4, 0, 0),
           C4=c(0, 30, 30, 4, 0, 0))

只是以C开头的列是+50。我将使用https://stackoverflow.com/a/10139458/792066创建一个带有C列的帕累托图表,但是大量的标签使图表变得毫无价值。通常的解决方案是创建一个名为“others”的新列,其中的列不是前5~10。我想我正在寻找summarize()对具有分类变量的因子列的作用。如果所有列的总和不在顶部X的范围内,如何将所有列汇总到新列?

1 个答案:

答案 0 :(得分:0)

以下是使用colSumsrowSums的基本R方法:

df <- data.frame(age = c("(0,5]", "(5,10]", "(10,15]", "(15,20]", "(20,25]", "(25,30]"),
                 C1 = c(0, 0, 0, 0, 0, 0),
                 C2 = c(0, 0, 0, 0, 0, 0),
                 C3 = c(0, 270, 30, 4, 0, 0),
                 C4 = c(0, 30, 30, 4, 0, 0))

others <- names(sort(-colSums(df[-1]))[-1:-2])

df$others <- rowSums(df[others])

df_lumped <- df[!names(df) %in% others]

df_lumped
#>       age  C3 C4 others
#> 1   (0,5]   0  0      0
#> 2  (5,10] 270 30      0
#> 3 (10,15]  30 30      0
#> 4 (15,20]   4  4      0
#> 5 (20,25]   0  0      0
#> 6 (25,30]   0  0      0

您需要根据要保留的列数调整[-1:-2]。例如,[-1:-5]将保持前5名。