根据 2 行删除重复项并指定每列要执行的操作

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

我的数据集包含:

  • 我想删除的重复 ID(
    ID1
    ID2
    列)
  • List
    可以包含重复项之间不同的规范 (
    type: string
    ),
  • 还有 2 列
    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 dplyr duplicates dcast
2个回答
2
投票

基本 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

1
投票

首先通过

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"
© www.soinside.com 2019 - 2024. All rights reserved.