如何根据包含相同值的特定列获取总和

问题描述 投票:0回答:1

数据框具有

code1
code2
code3
等列,其中存储有代码。对于每个代码,有一列包含使用天数
days_used1
days_used2
days_used3
等。我想获取一个数据框,其中包含每个代码的一列,其中包含
 中每个值的 days_used 总和code

data.frame(ID = c(1, 2, 3, 4, 5,6),
            code1 = c('D', 'D', 'C', 'A', 'G', "A"),
           days_used1 = c(NA, NA, 90, 63, 20, 50),
           code2 = c('A', 'H', 'D', 'G', 'A', "A"),
           days_used2 = c(15, NA, NA, 50, 20, 10),
           code3 = c('A', 'H', 'C', 'A', 'D', "D"),
           days_used3 = c(15, NA, NA, 50, 20, 10)
 )

所以我想要一个像这样的数据框:

data.frame(ID = c(1, 2, 3, 4, 5),
                  A= c(30, 0, 0, 20, 60),
                  D = c(0, 0, 0, 0, 20, 10),
                  C= c(0, 0, 90, 0, 20, 10),
                  G= c(0, 0, 0, 50, 20, 0),
                  H= c(0, 0, 0, 0, 0)
)

我真的不知道如何才能完成这件事。我按照下面示例的方式尝试了一些方法,但这显然不起作用

ifelse(test[paste0("code",c(1:3))] == "A",
         sum(test[paste0("code",c(1:3)) == "A"]+1), 
         0)
     code1 code2 code3
[1,]     0     0     0
[2,]     0     0     0
[3,]     0     0     0
[4,]     0     0     0
[5,]     0     0     0
[6,]     0     0     0
r dataframe sum
1个回答
0
投票

我们可以将列名在最后一个字符处拆分,然后按 ID 和代码进行计数,然后进行传播:

library(tidyverse)
df |>
  pivot_longer(-ID, names_to = c(".value", "obs"), names_sep = -1) |>
  count(ID, code, wt = days_used) |>
  pivot_wider(names_from = code, values_from = n, values_fill = 0)
  

结果

# A tibble: 6 × 6
     ID     A     D     H     C     G
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1    30     0     0     0     0
2     2     0     0     0     0     0
3     3     0     0     0    90     0
4     4   113     0     0     0    50
5     5    20    20     0     0    20
6     6    60    10     0     0     0
© www.soinside.com 2019 - 2024. All rights reserved.