我正在寻找一种方法来反转一行的2列的值,当这种反转存在于 Dataframe 中时?

pgvzfuti  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(100)

下面是我的数据框:

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%的结果。
有人有主意吗?

7fhtutme

7fhtutme1#

您可以先使用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)
g9icjywg

g9icjywg2#

您可以尝试:

library(dplyr)

DF %>%
  mutate(across(VAR1:VAR2, as.character)) %>%
  group_by(idx1 = pmin(VAR1, VAR2), idx2 = pmax(VAR1, VAR2)) %>%
  summarise(VAR3 = sum(VAR3)) %>%
  rename_with(~ sub('idx', 'VAR', .)) %>%
  ungroup

输出:

# A tibble: 5 x 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

相关问题