数据框具有
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
我们可以将列名在最后一个字符处拆分,然后按 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