以下是我的数据框:

DF <- data.frame(
     VAR1 = c("A", "A", "B", "B", "B", "C", "C"),
     VAR2 = c("B", "C", "A", "D", "C", "B", "D"),
     VAR3 = c(1, 1, 1, 2, 4, 6, 4)
    )

我想要这个:

VAR1 VAR2 VAR3  
A    B    2 
A    C    1
B    D    2
B    C    10  
C    D    4

如果有像(VAR1=A, VAR2=B, VAR3=X)(VAR2=B, VAR1=A, VAR3=Y)这样的两行,我想要像这一行(VAR1=A, VAR2=B, VAR3=X+Y)这样的行.因此,如果前两个变量是"反转的",我希望它们的和占一行.

我试着有一个列,如果两行有相反的值,就会说"是",但我找不到这样做的方法. 我的代码是:

DF <- DF %>%
  mutate(VAR4 = case_when(VAR2 %in% DF$VAR1 & 
                          VAR1 %in% 
                            (DF %>% 
                                filter(VAR1 == VAR2) %>% 
                                pull(VAR2)
                             ) ~ "Yes",
                             TRUE ~ 'No' ))
    `

这就是结果:

VAR1   VAR2   VAR3   VAR4  
A      B      1      No
A      C      1      No 
B      A      1      No 
B      D      2      No 
B      C      4      No 
C      B      6      No 
C      D      4      No

我的代码无法工作,因为我的过滤器没有考虑%df$VAR1中的VAR2%的结果.

有没有人有主意?

推荐答案

您可以先用apply进行排序,然后总结:

DF[1:2] <- t(apply(DF[1:2], 1, sort))
DF %>% 
  group_by(VAR1, VAR2) %>% 
  summarise(VAR3 = sum(VAR3))

# A tibble: 5 × 3
# Groups:   VAR1 [3]
  VAR1  VAR2   VAR3
  <chr> <chr> <dbl>
1 A     B         2
2 A     C         1
3 B     C        10
4 B     D         2
5 C     D         4

或者,在单个管道中:

DF %>% 
  mutate(VAR = pmap(., ~ sort(c(..1, ..2)) %>% 
                      set_names(., c("VAR1", "VAR2")))) %>% 
  group_by(VAR) %>% 
  summarise(VAR3 = sum(VAR3)) %>% 
  unnest_wider(VAR)

R相关问答推荐

使用列/行匹配将两个不同维度的矩阵相加

如何同时从多个列表中获取名字?

使用data.table::fcase()而不是dplyr::case_When()时保持值

`lazy_dt`不支持`dplyr/across`?

如何在PackageStatus()中列出&q;不可用的包&q;?

有没有一种方法可以同时对rhandsontable进行排序和从rhandsontable中删除?

R如何计算现有行的总和以添加新的数据行

在纵向数据集中创建新行

远离理论值的伽马密度曲线下面积的近似

有没有办法将基于每个值中出现的两个关键字或短语的字符串向量重新编码为具有这两个值的新向量?

基于R中的辅助向量中的值有条件地连接向量中的字符串

填充图例什么时候会有点?

如何调整一个facet_work()面板内的框图和移动标签之间的水平宽度?

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

有没有办法更改ggplot2中第二个y轴的比例限制?

从字符串01JAN2021创建日期

如何使用str_Detect计算并返回列表中检测到的字符串?

将3个连续公式的函数应用于具有相同变量的稳健数据框

Terra::Forecast()直接应用于溅射栅格

如果可能的话,寻找一种更有效的方式来实现这个R代码