2

这是我的数据框

Colour = c("red",   "blue", "red",  "blue", "yellow",   "green",    "red",  "blue", "green",    "red",  "yellow",   "blue")
Volume  = c(46,46,57,57,57,57,99,99,99,111,111,122)
Cases   = c(7,2,4,2,3,5,1,2,3,2,4,1)
df = data.frame(Colour, Volume, Cases)

"red"如果颜色是OR"blue"但如果体积相同,我想总结案例。应保留那些未指定的颜色。如果红色和蓝色因为不同而无法总结,Volume那么它们也应该保留

结果应该是这样的:

Colour = c("red_or_blue","red_or_blue","yellow","green","red_or_blue","green","red","yellow","blue")
Volume  = c(46,57,57,57,99,99,111,111,122)
Cases   = c(9,6,3,5,3,3,2,4,1)
df_agg = data.frame(Colour, Volume, Cases)

我已经找到了一种方法,可以创建另一列,为"red_or_blue"红色或蓝色的行分配一个,为其余行分配一个 x。然后我使用了聚合:

df$test = ifelse(df$Colour %in% c("red", "blue"),"red_or_blue","x")
df_agg = aggregate(df$Cases, list(df$Volume, df$test), sum)

它有效,但我发现这有点麻烦。有没有更方便的方法可以跳过创建额外的列?将来我需要总结第 57/99 卷的红色/蓝色和案例。拥有额外的列似乎使它变得更加棘手。

此外,如果它不是红色也不是蓝色,我没有设法让原始颜色被接管。我尝试过这种方式,但它不起作用:

df$test = ifelse(df$Colour %in% c("red", "blue"),"red_or_blue",df$Colour)

干杯,保罗

4

2 回答 2

1

这是一种坚持基础 R 的方法(但可能不是最有效的方法....)

  1. 按以下方式将数据分组Volume

    temp = split(df, df$Volume)
    
  2. 创建一个快速函数以仅在存在“红色”和“蓝色”的组中更改“红色”和“蓝色”的

    red.and.blue = function(x) {
      if (sum(c("red", "blue") %in% x$Colour) > 1) {
        x$Colour = gsub("red|blue", "red-and-blue", x$Colour)
      } else {
        x$Colour = as.character(x$Colour)
      }
      x
    }
    
  3. temp在您在步骤 1 中创建的对象上使用该函数:

    temp = lapply(temp, red.and.blue)
    
  4. 用于aggregate()执行您需要执行的聚合。在参数中指定名称,aggregate()以便您保留原始列名。

    temp = lapply(temp, function(x) aggregate(list(Cases = x$Cases), 
                                              list(Colour = x$Colour, 
                                                   Volume = x$Volume), sum))
    
  5. 将其全部放回data.frame(). 如果要按原样存储,请不要忘记分配名称。

    do.call(rbind, temp)
    #             Colour Volume Cases
    # 46    red-and-blue     46     9
    # 57.1         green     57     5
    # 57.2  red-and-blue     57     6
    # 57.3        yellow     57     3
    # 99.1         green     99     3
    # 99.2  red-and-blue     99     3
    # 111.1          red    111     2
    # 111.2       yellow    111     4
    # 122           blue    122     1
    
于 2012-08-17T08:21:06.693 回答
0

我认为如果您遵循@mrdwab 的方法,您可以sapply在每个“拆分卷”上使用

df$Cases <- sum(df[(df$Colour =='blue' | df$Colour == 'red'),][,3])

得到案例的数量,和

df$Colour[(df$Colour =='blue' | df$Colour == 'red')] <- 'readandblue'

更改颜色名称。我也愿意打赌有一个 2 线解决方案正在使用ddply,但我不是那个工具的专家(还)。

于 2012-08-17T12:24:04.113 回答