我的数据集包含:
ID1
和 ID2
列)List
可以包含重复项之间不同的规范 (type: string
),V1
和 V2
,其中包含我想要在重复项之间 type: int
的值 (sum
)。我的数据集的一个简单示例是这样的:
df <- data.frame(
ID1 = c('A','A','B','C','D','D'),
ID2 = c('A','A','B1','C1','DE','DE'),
List = c('LA','LA','LB','LC','L1D','L2D'),
V1 = c(1, 0, 1, 1, 1, 1),
V2 = c(0, 1, 0, 0, 1, 1),
stringsAsFactors = FALSE
)
> df
ID1 ID2 List V1 V2
1 A A LA 1 0
2 A A LA 0 1
3 B B1 LB 1 0
4 C C1 LC 1 0
5 D DE L1D 1 1
6 D DE L2D 1 1
我想以此结束:
> df_final
ID1 ID2 List_1 List_2 V1 V2
1 A A LA LA 1 1
3 B B1 LB 1 0
4 C C1 LC 1 0
5 D DE L1D L2D 2 2
所以我的想法是首先dcast
List
专栏:
df <- df %>%
group_by(ID1, ID2) %>%
mutate(Index = row_number(List))
然后用这样的东西进行dcast:
df <- dcast(df, ID1+ID2 +V1 + V2 ~ Index, value.var = "List", fun.aggregate =sum)
但是当还涉及因素时它无法处理
sum
(这是有道理的)。我怎样才能最好地做到这一点才能到达df_final
?
基本 R 选项,带有
aggregate
+ merge
merge(
aggregate(List ~ ID1 + ID2, df, `length<-`, 2),
aggregate(cbind(V1, V2) ~ ID1 + ID2, df, sum)
)
这给出了
ID1 ID2 List.1 List.2 V1 V2
1 A A LA LA 1 1
2 B B1 LB <NA> 1 0
3 C C1 LC <NA> 1 0
4 D DE L1D L2D 2 2
首先通过
ID1和ID2进行
summarize
操作,然后使用sum
以及unnest
操作List。如果您希望 unnest 生成的 NA
为空字符串,请包含最后一个 mutate,否则只需将其省略即可。
library(dplyr)
library(tidyr)
df %>%
summarize(across(V1:V2, ~ sum(.x)),
List=list(List), .by = c(ID1, ID2)) %>%
unnest_wider(List, names_sep="_") %>%
mutate(across(starts_with("List_"), ~ replace_na(.x, "")))
输出
# A tibble: 4 × 6
ID1 ID2 V1 V2 List_1 List_2
<chr> <chr> <dbl> <dbl> <chr> <chr>
1 A A 1 1 LA "LA"
2 B B1 1 0 LB ""
3 C C1 1 0 LC ""
4 D DE 2 2 L1D "L2D"