如何对数据帧中的相同单元格求和?

时间:2019-08-20 12:09:02

标签: r dataframe data.table

我正在使用Pajek软件定义时态网络。
在我正在使用的数据和代码下面:

library(data.table)
Aggregated <- fread("
    act1_1 act1_2 act1_3 act1_4 act1_5
    2        1      3      2    6
    1        2      2      1  1
    1        4      2      2  3
    ")


cols <- names(Aggregated)
n <- length(cols)

vi <- CJ(rn = 1:nrow(Aggregated), len = 2:5, start = 1:n)[

  , end := start + len - 1L][

    end <= n]

dl <- melt(setDT(Aggregated)[, rn := .I], id.vars = "rn", variable.name = "pos", 
           variable.factor = TRUE)[

             , pos := as.integer(pos)][]

result <- dl[vi, on = .(rn, pos >= start, pos <= end), 
             .(rn, values = toString(value), position = toString(cols[x.pos])), 
             by = .EACHI, nomatch = 0L][

               , .(freq = .N), by = .(values, position)]

result[order(nchar(values), values)]

结果以下:

           values                               position freq
 1:          1, 1                         act1_4, act1_5    1
 2:          1, 2                         act1_1, act1_2    1
 3:          1, 3                         act1_2, act1_3    1
 4:          1, 4                         act1_1, act1_2    1
 5:          2, 1                         act1_1, act1_2    1
 6:          2, 1                         act1_3, act1_4    1
 7:          2, 2                         act1_2, act1_3    1
 8:          2, 2                         act1_3, act1_4    1
 9:          2, 3                         act1_4, act1_5    1
10:          2, 6                         act1_4, act1_5    1
11:          3, 2                         act1_3, act1_4    1
12:          4, 2                         act1_2, act1_3    1
13:       1, 2, 2                 act1_1, act1_2, act1_3    1
14:       1, 3, 2                 act1_2, act1_3, act1_4    1
15:       1, 4, 2                 act1_1, act1_2, act1_3    1
16:       2, 1, 1                 act1_3, act1_4, act1_5    1
17:       2, 1, 3                 act1_1, act1_2, act1_3    1
18:       2, 2, 1                 act1_2, act1_3, act1_4    1
19:       2, 2, 3                 act1_3, act1_4, act1_5    1
20:       3, 2, 6                 act1_3, act1_4, act1_5    1
21:       4, 2, 2                 act1_2, act1_3, act1_4    1
22:    1, 2, 2, 1         act1_1, act1_2, act1_3, act1_4    1
23:    1, 3, 2, 6         act1_2, act1_3, act1_4, act1_5    1
24:    1, 4, 2, 2         act1_1, act1_2, act1_3, act1_4    1
25:    2, 1, 3, 2         act1_1, act1_2, act1_3, act1_4    1
26:    2, 2, 1, 1         act1_2, act1_3, act1_4, act1_5    1
27:    4, 2, 2, 3         act1_2, act1_3, act1_4, act1_5    1
28: 1, 2, 2, 1, 1 act1_1, act1_2, act1_3, act1_4, act1_5    1
29: 1, 4, 2, 2, 3 act1_1, act1_2, act1_3, act1_4, act1_5    1
30: 2, 1, 3, 2, 6 act1_1, act1_2, act1_3, act1_4, act1_5    1

我的问题是如何创建另一列来对具有相同值的频率进行计数,例如:

                                                              Sum of freq
 5:          2, 1                         act1_1, act1_2    1      2
 6:          2, 1                         act1_3, act1_4    1
 7:          2, 2                         act1_2, act1_3    1      2
 8:          2, 2                         act1_3, act1_4    1

2 个答案:

答案 0 :(得分:1)

也许这会有所帮助:

library(data.table)
#... this is the last row of your code renamed
df <- result[order(nchar(values), values)]
df[,summed:=sum(freq), by=values]

 df
           values                               position freq summed
 1:          1, 1                         act1_4, act1_5    1      1
 2:          1, 2                         act1_1, act1_2    1      1
 3:          1, 3                         act1_2, act1_3    1      1
 4:          1, 4                         act1_1, act1_2    1      1
 5:          2, 1                         act1_1, act1_2    1      2
 6:          2, 1                         act1_3, act1_4    1      2
 7:          2, 2                         act1_2, act1_3    1      2
 8:          2, 2                         act1_3, act1_4    1      2
 9:          2, 3                         act1_4, act1_5    1      1
10:          2, 6                         act1_4, act1_5    1      1
11:          3, 2                         act1_3, act1_4    1      1
...

编辑: 您可以尝试以下方法:

df$sm <- ifelse(duplicated(df$values) == T, NA, df$summed)
df
           values                               position freq summed sm
 1:          1, 1                         act1_4, act1_5    1      1  1
 2:          1, 2                         act1_1, act1_2    1      1  1
 3:          1, 3                         act1_2, act1_3    1      1  1
 4:          1, 4                         act1_1, act1_2    1      1  1
 5:          2, 1                         act1_1, act1_2    1      2  2
 6:          2, 1                         act1_3, act1_4    1      2 NA
 7:          2, 2                         act1_2, act1_3    1      2  2
 8:          2, 2                         act1_3, act1_4    1      2 NA
 9:          2, 3                         act1_4, act1_5    1      1  1
10:          2, 6                         act1_4, act1_5    1      1  1

答案 1 :(得分:1)

它可能不漂亮,可能有点乏味,但也许您可以使用

sum_of_frequencies <- c(sum(df$freq[df$values == "4,4"]),
sum(df$freq[df$values == "12,4"]),
...)

当然,您必须为每个拥有的值进行此操作,并且取决于有多少值可能需要一段时间。然后,如果您想看

values <- c("4,4", "12,4" ...)
see_sum_of_freq <- data.frame(sum_of_frequencies, values)

这又取决于您的数量,可能需要一段时间