R-根据不同行中的两列比较并保留第三列中的值

时间:2020-06-06 13:24:06

标签: r dataframe

我有一个像这样的数据框:

df <- data.frame(col1=c("A","B","C","D","E"),col2=c("B","A","D","C","F"),col3=c(5,3,1,6,2))

col1  col2  col3
 A     B     5
 B     A     3
 C     D     1
 D     C     6
 E     F     2

我想根据col1和col2检查col3中的值。如果col1中的字符串/值等于col2中的字符串/值,则比较col3中的值并使行具有更大的值。 结果应如下:

df1 <- data.frame(col1=c("A","D","E"),col2=c("B","C","F"),value=c(5,6,2)) 

col1  col2  col3
 A     B     5
 D     C     6
 E     F     2

目前,我使用循环来解决此问题。但是我有一个大数据。那么,有谁知道如何有效地解决这个问题?非常感谢!

2 个答案:

答案 0 :(得分:1)

col1col2中的数据进行排序,然后在col3中选择具有最大值的行:

library(dplyr)
df %>%
  group_by(newcol1 = pmin(col1, col2), newcol2 = pmax(col1, col2)) %>%
  slice(which.max(col3)) %>%
  ungroup() %>%
  select(names(df))

# A tibble: 3 x 3
#  col1  col2   col3
#  <chr> <chr> <dbl>
#1 A     B         5
#2 D     C         6
#3 E     F         2

答案 1 :(得分:0)

我们可以使用data.table方法

library(data.table)
i1 <- setDT(df)[, .I[which.max(col3)], .(pmin(col1, col2), pmax(col1, col2))]$V1
df[i1]
#    col1 col2 col3
#1:    A    B    5
#2:    D    C    6
#3:    E    F    2

或使用base R

aggregate(col3 ~ ., cbind(as.data.frame(t(apply(df[1:2], 1, sort))), 
           df['col3']), max)